在GitLab CI作业中构建Docker容器

41次阅读
没有评论

问题描述

在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镜像,可以参考以下步骤。

  1. 首先,确保你的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"
  1. 修改你的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镜像。你可以根据你的需求选择适合你的方法。

正文完