Gitlab CI 构建 docker 镜像

利用 Gitlab CI 结合 Docker 构建 docker 镜像主要有三种方法。

  1. 将 Docker 执行器与 Docker 镜像一起使用。
  2. 使用 shell 执行器
  3. Docker socket 绑定

现在来讲讲我的具体使用过程和遇到的一些问题,由于我的 gitlab-runners 使用了 docker 执行器,所以我主要使用了 1 和 3 两种方法。

由于网上的相关文章主要是采用 Docker in Docker 的方式,所以最开始我也是采用这种方式。 我的 ci 脚本是:

services:
  - docker:dind
variables:
  OUTPUT_NAME: bot
  DOCKER_HOST: tcp://localhost:2375
  DOCKER_DRIVER: overlay2
  DOCKER_TLS_CERTDIR: ""

build_docker_image_and_push_to_nexus:
  stage: build
  image: docker:stable
  extends: .go-cache
  script:
    - docker info
    - docker build -t docker.overtsarry.vip/bot:1.0.1 .
    - docker login --username=$username docker.overtsarry.vip --password $pwd
    - docker push docker.overtsarry.vip/bot:1.0.1

运行 CI,发现 CI 运行失败,具体报错是

Cannot connect to the Docker daemon at tcp://localhost:2375. Is the docker daemon running?

没有发现 docker daemon 运行,由于 gitlab doc 宕机了,在网上又看了一些文章,根据那些文章进行了十几次的修改,还是没有运行成功。后来查看 gitlab 相关文档,发现 docker 需要在 privileged 下运行。(The Docker image has all of the docker tools installed and can run the job script in context of the image in privileged mode.) 就需要修改 gitlab-runners 的配置文件,设置 privileged = true 即可。 img.png 修改完配置文件,再次运行 CI,docker 镜像顺利构建上传。 使用 Docker in Docker 构建成功后,我还顺便尝试使用 Docker socket 绑定来构建 docker 镜像。 这次有了文档辅助进度快了许多,具体的流程:

  1. 安装 gitlab-runner
  2. 注册 gitlab-runner,向 docker 执行程序注册一个运行程序并共享/var/run/docker.socket
sudo gitlab-runner register -n \
  --url https://overstarry.gitlab.com/ \
  --registration-token REGISTRATION_TOKEN \
  --executor docker \
  --description "My Docker Runner" \
  --docker-image "docker:19.03.12" \
  --docker-volumes /var/run/docker.sock:/var/run/docker.sock

gitlab-runner 就注册成功了,你会发现在你的 runner 配置文件中有一行相关的条目。

volumes = ["/var/run/docker.sock:/var/run/docker.sock","/cache"]
  1. 接下来编写你的 ci 文件,我的文件如下:
build:
  image: docker:20.10.7
  stage: build
  before_script:
    - echo "docker build"
  script:
    - docker login --username=$username docker.overtsarry.vip --password $pwd
    - docker build -t docker.overstarry.vip/messenger-service:"$CI_COMMIT_SHA" .  # 本地构建 docker 镜像
    - docker push docker.overstarry.vip/messenger-service:"$CI_COMMIT_SHA" # 根据 CI_COMMIT_SHA push 镜像
    - docker tag docker.overstarry.vip/messenger-service:"$CI_COMMIT_SHA" docker.overstarry.vip/messenger-service:latest
    - docker push docker.overstarry.vip/messenger-service:latest # 替换 registry latest 镜像
    - docker rmi docker.overstarry.vip/messenger-service:"$CI_COMMIT_SHA"
    - docker rmi docker.overstarry.vip/messenger-service:latest
  1. 运行 CI,运行成功。

参考文章