从 gitlab runner 上的 docker 容器访问存储库时出现问题
Problem with repository access from a docker container on a gitlab runner
tl;dr
使用具有 docker 支持的 gitlab runner 以及来自存储库的完成容器和源代码的预期方式和理念是什么?如何将源代码存储库挂载到容器中?
我们目前正在将我们的 gitlab runner(本地)转换为 gitlab runner,并提供 docker 支持。它们的工作原理不同,我仍然无法理解如何将它们用于我们的目的。
尽管问题有点宽泛,但我尽量将其限制在更具体的用例中。
假设我们想要在编程项目(例如 Java 或 C++)中进行代码分析,这应该在推送到开发分支后定期进行。
第 1 阶段:构建容器
为此,我创建了一个 docker 文件和 assemble 所有必需的应用程序和库。我将这个容器推送到我们的注册表中,以便可以一次又一次地使用它。只有我修改了docker文件,才应该重建它。
第 2 阶段:验证源代码
这一步要拉取Docker容器,分析源码。我的问题来了:容器如何从存储库中获取源代码?
我已经尝试通过 -v
使用 docker 调用来包含源代码文件夹,但它似乎不起作用。我收到 -v
不是可执行程序的错误消息。所以我猜想这种可能性不是故意的。
另一种可能是在构建容器时集成源代码,但我认为这没有用。另一种可能性是包括通过 config.toml
的路径,类似于 -v
,但即使这样对我来说似乎也不是正确的解决方案。我只能通过 ssh
.
访问配置文件
另一种解决方案是通过 git 查看 运行 容器中的源代码...也不太好。
长话短说:使用存储库中完成的容器和源代码的预期方式和理念是什么?
我们将 gitlab runner 与 shell executor 一起使用。
variables:
DOCKER_DRIVER: overlay2
DOCKER_BUILDKIT: 1
CI_REGISTRY: ***
CI_REGISTRY_IMAGE: ***/test
CI_REGISTRY_USER: ***
CI_REGISTRY_PASSWORD: ***
stages:
- build
- test
before_script:
- docker login -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD $CI_REGISTRY
build_container:
stage: build
only:
changes:
- Dockerfile
tags:
- docker
before_script:
- docker pull $CI_REGISTRY_IMAGE:latest
script:
- docker build --cache-from $CI_REGISTRY_IMAGE:latest -t $CI_REGISTRY_IMAGE .
after_script:
- docker push $CI_REGISTRY_IMAGE:latest
validate:
stage: test
script:
- docker run $CI_REGISTRY_IMAGE /script/to/validate/code
我认为混淆是由于将两个本来应该分开的东西混在一起造成的。
Docker 图像应该在其自己的项目中构建和发布,如果您想重复使用它。有些构建需要一段时间,因此您可以使用已构建的映像来节省时间。
准备好要下拉的图像后,您可以继续使用该图像做任何您想要的事情。
您在 gitlab-ci.yml 文件中调用图像,然后它可以访问管道正在 运行 中的项目的存储库。
在 gitlab-ci.yml 中,您使用 'image' 标签来指定您想要使用的 docker 图像。您可以为单个作业指定图像。
image: python
python job:
script: python hello-world.py
java job:
image: golang
script: go run hello-world.go
好吧,我通过再次阅读 Docker
manual 解决了这个问题。 -v
的执行错误在于参数放错了地方。下面的示例显示了正确的使用方法。
解释:
--rm
- 导致 Docker 在容器退出时自动删除容器
-v
- 导致 Docker 在容器 的 /mnt
中安装 repository/project $CI_PROJECT_DIR
代码片段:
validate:
stage: test
tags:
- docker
script:
- docker run --rm -v $CI_PROJECT_DIR:/mnt $CI_REGISTRY_IMAGE /bin/ash -c "/some/command /mnt/sourcecode/"
tl;dr
使用具有 docker 支持的 gitlab runner 以及来自存储库的完成容器和源代码的预期方式和理念是什么?如何将源代码存储库挂载到容器中?
我们目前正在将我们的 gitlab runner(本地)转换为 gitlab runner,并提供 docker 支持。它们的工作原理不同,我仍然无法理解如何将它们用于我们的目的。 尽管问题有点宽泛,但我尽量将其限制在更具体的用例中。
假设我们想要在编程项目(例如 Java 或 C++)中进行代码分析,这应该在推送到开发分支后定期进行。
第 1 阶段:构建容器 为此,我创建了一个 docker 文件和 assemble 所有必需的应用程序和库。我将这个容器推送到我们的注册表中,以便可以一次又一次地使用它。只有我修改了docker文件,才应该重建它。
第 2 阶段:验证源代码 这一步要拉取Docker容器,分析源码。我的问题来了:容器如何从存储库中获取源代码?
我已经尝试通过 -v
使用 docker 调用来包含源代码文件夹,但它似乎不起作用。我收到 -v
不是可执行程序的错误消息。所以我猜想这种可能性不是故意的。
另一种可能是在构建容器时集成源代码,但我认为这没有用。另一种可能性是包括通过 config.toml
的路径,类似于 -v
,但即使这样对我来说似乎也不是正确的解决方案。我只能通过 ssh
.
另一种解决方案是通过 git 查看 运行 容器中的源代码...也不太好。
长话短说:使用存储库中完成的容器和源代码的预期方式和理念是什么?
我们将 gitlab runner 与 shell executor 一起使用。
variables:
DOCKER_DRIVER: overlay2
DOCKER_BUILDKIT: 1
CI_REGISTRY: ***
CI_REGISTRY_IMAGE: ***/test
CI_REGISTRY_USER: ***
CI_REGISTRY_PASSWORD: ***
stages:
- build
- test
before_script:
- docker login -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD $CI_REGISTRY
build_container:
stage: build
only:
changes:
- Dockerfile
tags:
- docker
before_script:
- docker pull $CI_REGISTRY_IMAGE:latest
script:
- docker build --cache-from $CI_REGISTRY_IMAGE:latest -t $CI_REGISTRY_IMAGE .
after_script:
- docker push $CI_REGISTRY_IMAGE:latest
validate:
stage: test
script:
- docker run $CI_REGISTRY_IMAGE /script/to/validate/code
我认为混淆是由于将两个本来应该分开的东西混在一起造成的。
Docker 图像应该在其自己的项目中构建和发布,如果您想重复使用它。有些构建需要一段时间,因此您可以使用已构建的映像来节省时间。
准备好要下拉的图像后,您可以继续使用该图像做任何您想要的事情。
您在 gitlab-ci.yml 文件中调用图像,然后它可以访问管道正在 运行 中的项目的存储库。
在 gitlab-ci.yml 中,您使用 'image' 标签来指定您想要使用的 docker 图像。您可以为单个作业指定图像。
image: python
python job:
script: python hello-world.py
java job:
image: golang
script: go run hello-world.go
好吧,我通过再次阅读 Docker
manual 解决了这个问题。 -v
的执行错误在于参数放错了地方。下面的示例显示了正确的使用方法。
解释:
--rm
- 导致 Docker 在容器退出时自动删除容器-v
- 导致 Docker 在容器 的
/mnt
中安装 repository/project $CI_PROJECT_DIR
代码片段:
validate:
stage: test
tags:
- docker
script:
- docker run --rm -v $CI_PROJECT_DIR:/mnt $CI_REGISTRY_IMAGE /bin/ash -c "/some/command /mnt/sourcecode/"