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

我遇到与gitlab CI构build奇怪的问题。

我的脚本看起来像这样:

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

这是工作了几次,但之后我开始犯错:

docker:来自守护进程的错误响应:Conflict。 容器名称“/ myimage”已被容器使用。

我已经login了执行该步骤的特定机器,并且docker ps -a已经显示该图像留在了构build机器上。

我期望gitlab CI构build步骤通过在Docker容器中运行它们与外部环境完全分离…所以构build不会“损害”其他构build的环境。 所以我期望所有由CI创build的图像和容器都可以简单地灭亡……事实并非如此

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

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

不,你的Gitlab没有configuration错误。 Gitlab会清理它的运行者和执行者(运行你的命令的docker镜像)。

由于您使用的是DinD(Docker-in-Docker),所以您启动或构build的任何容器实际上都构build在同一个主机上,并且除了作业执行程序容器之外,不在“内部”容器中运行。

因此,你应该清理干净,Gitlab不知道你在工作内部做了什么,所以它不负责任。

我运行与您描述的相同情况的各种pipe道,所以一些build议:

  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命令在主机上被调用,而不是在内部映像。 这本身不是一个错误configuration,但另一种方法是使用dind服务: https : dind

它需要做3件事情:

  1. 添加以下部分到gitlab ci config:
 services: - docker:dind 
  1. 在ci config中定义variablesDOCKER_DRIVER: overlay2 ,或者在config.toml定义全局variables

  2. 加载内核模块overlay/etc/modules