问题描述
在GitLab CI作业中尝试构建一个Docker镜像。他使用自己的GitLab实例,并在一个单独的机器上运行CI作业。他尝试了多种不同的配置来使用Docker in Docker,但都失败了。他的当前尝试是从这篇博文中获取的方法:https://medium.com/@tonywooster/docker-in-docker-in-gitlab-runners-220caeb708ca。
在使用docker命令执行CI作业时,他遇到了以下错误:
ERROR: Failed to remove network for build
ERROR: Preparation failed: Cannot connect to the Docker daemon at tcp://gitlab-dind:2375. Is the docker daemon running? (docker.go:745:240s)
他想知道为什么会出现这个错误,以及如何修复它。他也愿意尝试任何其他能够在CI作业中构建和推送Docker容器的工作方法。
以下是他提供的GitLab CI文件:
image: docker
stages:
- package
- test
- push
build docker image:
stage: package
tags:
- docker
script:
- cat /proc/self/cgroup
- docker info
- docker build -t $CI_REGISTRY_IMAGE .
test docker image:
stage: test
tags:
- docker
script:
- docker run $CI_REGISTRY_IMAGE python testscript.py
push docker image:
stage: push
tags:
- docker
script:
- docker tag $CI_REGISTRY_IMAGE:$CI_COMMIT_SHA
- echo $CI_REGISTRY_PASSWORD | docker login -u $CI_REGISTRY_USER $CI_REGISTRY --password-stdin
- docker push $CI_REGISTRY_IMAGE
解决方案
请注意以下操作可能存在版本差异,请做好备份。
使用Kaniko构建Docker镜像
在GitLab Runner中构建Docker镜像,建议使用Kaniko而不是”Docker in Docker”方法。你可以阅读Kaniko与GitLab Runner的官方文档:https://docs.gitlab.com/ee/ci/docker/using_kaniko.html。
使用Docker in Docker方法构建
如果你仍然想使用Docker in Docker方法构建Docker镜像,可以参考以下步骤。
- 首先,确保你的GitLab CI Runner机器已经配置了Docker Daemon,可以通过tcp连接方式运行。你可以在你的GitLab CI Runner配置文件中添加以下环境变量:
DOCKER_HOST: "tcp://docker:2376"
DOCKER_TLS_CERTDIR: "/certs"
DOCKER_TLS_VERIFY: "1"
DOCKER_CERT_PATH: "$DOCKER_TLS_CERTDIR/client"
- 修改你的GitLab CI文件如下:
image: docker:20.10.16-dind
stages:
- build
build docker image:
stage: build
tags:
- docker-on-prem
script:
- docker build -t test .
请确保替换docker-on-prem
为你的GitLab Runner标签,并根据实际情况修改Docker镜像的标签和构建命令。
示例仓库和Dockerfile
你可以访问以下示例仓库,其中包含了一个可以用来测试流水线的Dockerfile:
https://gitlab.com/warrior7089/gitlab-self-hosted-runners-demo/
这个仓库中的.gitlab-ci.yml
文件是一个使用Docker in Docker方法构建Docker镜像的示例。你可以参考其中的配置来进行你的实际项目配置。
注意事项
- 在使用Docker in Docker方法时,可能会遇到一些权限和网络问题,因此请确保正确设置权限和网络配置。
- 由于不同版本的Docker和GitLab Runner可能会有一些差异,建议根据官方文档进行配置和调整。
以上方案提供了两种不同的方法来在GitLab CI作业中构建Docker镜像。你可以根据你的需求选择适合你的方法。