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 件事:
- 将以下部分添加到 gitlab ci 配置:
services:
- docker:dind
在 ci 配置中定义变量 DOCKER_DRIVER: overlay2
,或者在 config.toml
中全局定义变量 DOCKER_DRIVER: overlay2
加载内核模块overlay
(/etc/modules
)
我在使用 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 件事:
- 将以下部分添加到 gitlab ci 配置:
services: - docker:dind
在 ci 配置中定义变量
DOCKER_DRIVER: overlay2
,或者在config.toml
中全局定义变量 加载内核模块
overlay
(/etc/modules
)
DOCKER_DRIVER: overlay2