Gitlab CI构建docker镜像

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

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

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

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

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
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运行失败,具体报错是

1
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
1
2
3
4
5
6
7
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配置文件中有一行相关的条目。

1
volumes = ["/var/run/docker.sock:/var/run/docker.sock","/cache"]
  1. 接下来编写你的ci文件,我的文件如下:
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
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,运行成功。

参考文章