Gitlab CI构建docker镜像
利用Gitlab CI结合Docker构建docker镜像主要有三种方法.
- 将 Docker 执行器与 Docker 镜像一起使用.
- 使用 shell 执行器
- 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即可。 修改完配置文件,再次运行CI,docker镜像顺利构建上传。 使用Docker in Docker构建成功后,我还顺便尝试使用Docker socket 绑定来构建docker镜像。 这次有了文档辅助进度快了许多,具体的流程:
- 安装gitlab-runner
- 注册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"]
- 接下来编写你的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
- 运行CI,运行成功。