docker 在 gitlab CI 中拉取的图像/运行 会发生什么?

What happens to docker images pulled / run in gitlab CI?

我在使用 gitlab CI 构建时遇到了一个奇怪的问题。

我的脚本是这样的:

 - docker pull myrepo:myimage
 - docker tag myrepo:myimage myimage
 - docker run --name myimage myimage

它运行了几次,但后来我开始遇到错误:

docker: Error response from daemon: Conflict. The container name "/myimage" is already in use by container ....

我已经登录到执行该步骤的特定机器,docker ps -a 显示图像留在构建机器上...

我预计 gitlab CI 构建步骤通过 运行 在 docker 容器中与外部环境完全分离...这样构建就不会 'spoil' 其他构建的环境。所以我希望 CI build 创建的所有图像和容器都会消亡......事实并非如此......

我的 gitlab 是否配置错误,或者这是预期的行为,docker 图像/容器存在于主机上下文中而不是 docker 图像中?

在我的构建中,我使用图像 docker:latest

不,您的 Gitlab 没有配置错误。 Gitlab 确实清理了它的 运行ners 和 executors(docker 图像你 运行 你的命令)。

由于您使用的是 DinD (Docker-in-Docker),您启动或构建的任何容器实际上都构建在同一主机上,运行s 除了您的作业执行器容器,不是 'inside' 它。

因此你应该清理一下,Gitlab 不知道你在工作中做了什么,所以它不对此负责。

我运行各种流水线与你描述的情况相同所以一些建议:

 job:
   script:
   - docker pull myrepo:myimage
   - docker tag myrepo:myimage myimage
   - docker run --name myimage myimage
   after_script:
   # Stop any running containers, if they are not running anymore (since its not a run -d), ignore errors about that.
   - docker rm -f myrepo:myimage myimage || true
   # Remove pulled images
   - docker rmi -f myrepo:myimage image

此外(我当然不知道你的确切工作)这可能会更短:

 job:
   script:
   # Only pull if you want to 'refresh' any images that would be left behind
   - docker pull myrepo:myimage
   - docker run --name myimage myrepo:myimage
   after_script:
   # Stop any running containers, if they are not running anymore (since its not a run -d), ignore errors about that.
   - docker rm -f myrepo:myimage || true
   # Remove pulled image
   - docker rmi -f myrepo:myimage

问题是,/var/run/docker.sock 被映射为卷,这导致所有 docker 命令都在主机上调用,而不是在图像内部调用。这本身并不是配置错误,但替代方法是使用 dind 服务:https://docs.gitlab.com/ce/ci/docker/using_docker_build.html#use-docker-in-docker-executor

需要完成 3 件事:

  1. 将以下部分添加到 gitlab ci 配置:
services:
 - docker:dind
  1. 在 ci 配置中定义变量 DOCKER_DRIVER: overlay2,或者在 config.toml

  2. 中全局定义变量 DOCKER_DRIVER: overlay2
  3. 加载内核模块overlay (/etc/modules)