GitLab 是一个全球知名的一体化 DevOps 平台,很多人都通过私有化部署 GitLab 来进行源代码托管。极狐GitLab :https://gitlab.cn/install?channel=content&utm_source=csdn 是 GitLab 在中国的发行版,专门为中国程序员服务。可以一键式部署极狐GitLab。
学习极狐GitLab 的相关资料:
- 极狐GitLab 官网:https://gitlab.cn
- 极狐GitLab 官网文档:https://docs.gitlab.cn
- 极狐GitLab 论坛:https://forum.gitlab.cn/
- 极狐GitLab 安装配置:https://gitlab.cn/install
- 极狐GitLab 资源中心:https://resources.gitlab.cn
搜索【极狐GitLab】公众号,后台输入加群,备注gitlab,即可加入官方微信技术交流群。
本文介绍构使用极狐GitLab Runner 构建 docker 镜像的五种方式:shell、docker_sock、docker_host、using_docker_build、using_kaniko。
理论执行效率
shell > docker_sock > docker_host > using_docker_build > using_kaniko
修改 GitLab Runner 运行时用户
- 根据需要进行调整
# 查看当前runner用户
ps aux | grep gitlab-runner
# 删除gitlab-runner
sudo gitlab-runner uninstall
# 安装并设置--user(例如我想设置为root)
gitlab-runner install --working-directory /home/gitlab-runner --user root
# 重启gitlab-runner
sudo service gitlab-runner restart
# 再次执行会发现--user的用户名已经更换成root了
ps aux | grep gitlab-runner
方案 1:使用 Docker-in-Docker 构建 Docker 镜像
文档
- 极狐 GitLab:中文文档
介绍
在 Docker 中使用 Docker 镜像创建 Docker 容器,并在该容器内构建 Docker 镜像
-
Docker 构建时的环境是一个独立的、隔离的 Docker 环境
-
需要 特权身份 运行 GitLab 流水线,可能存在越权行为
-
极狐GitLab Runner 流水线 使用 Docker-in-Docker 执行时需要创建两个容器
-
在流水线中,使用关键字 services 来创建流水线执行时所需的服务
-
GitLab Runner Docker 执行器 特权身份 配置,其他执行器配置雷同
# 配置文件位置:/etc/gitlab-runner/config.toml [[runners]] name = "lighthouse-docker" url = "https://jihulab.com/" ...省略 executor = "docker" [runners.docker] # 此处配置 privileged = true,让流水线使用特权身份执行 privileged = true ...省略
-
在早期相关文档介绍时,使用 docker:latest(最新版Docker命令行镜像)、docker:26.1.1(指定版本的Docker命令行镜像)、26.1.1-alpine3.19(指定版本的使用 alpine 为基础镜像的Docker命令行镜像)
-
在比较新的相关文档介绍时,使用 docker:cli(最新版、最小化Docker命令行镜像)、docker:26.1.1-cli(指定版本的、最小化Docker命令行镜像)、docker:26.1.1-cli-alpine3.19(指定版本的、最小化使用 alpine 为基础镜像的Docker命令行镜像)
-
使用 docker:cli 创建一个 Docker 客户端容器,也就是流水线执行时的容器
-
使用 docker:dind 创建一个 Docker 服务端容器,此容器需要使用 特权身份运行
-
-
支持 GitLab Runner 执行器:docker、docker+machine、kubernetes 等等
-
具体配置请参见 参考示例 的 using_docker_build 分支
方案 2:使用 kaniko 构建 Docker 镜像
文档
- 极狐 GitLab:中文文档
介绍
使用 gcr.io/kaniko-project/executor:debug 模拟 Docker 环境制作 Docker 镜像,无需特权身份运行
- Docker 构建时的环境是一个独立的、隔离的 Docker 环境
- 不需要 特权身份 运行 GitLab 流水线,不存在越权行为
- GitLab Runner 流水线 使用 kaniko 执行时只需要创建一个容器
- 支持 GitLab Runner 执行器:docker、docker+machine、kubernetes 等等
- gcr.io/kaniko-project/executor:debug 是最新版的镜像,推荐使用 具体版本(为了防止某天镜像进行不兼容更新造成异常)的 kaniko 镜像, 如:gcr.io/kaniko-project/executor:v1.21.0-debug,可访问kaniko 仓库 仓库的标签 来选择具体的版本
- 由于国内可能无法访问 gcr.io 域名,推荐大家使用作者个人镜像xuxiaoweicomcn/kaniko-project-executor
- 镜像标签名与原始标签保持一致即可
- 使用 GitLab 流水线 每周自动同步一次,镜像内容未做任何修改
- 具体配置请参见 参考示例 的 using_kaniko 分支
方案 3:使用 DOCKER_HOST 环境变量 指定现存的 Docker 服务 构建 Docker 镜像
文档
介绍
执行 Docker 命令 时,Docker 命令行工具 会 检查 环境变量 DOCKER_HOST 是否存在,如果存在时,Docker 命令行工具会与之通信, 用于完成 Docker 执行的命令
- Docker 构建时的环境是一个已经存在的环境,非独立环境
- 不需要 特权身份 运行 GitLab 流水线,不存在越权行为
- 环境变量 DOCKER_HOST 的示例:tcp://192.168.5.4:2375(即:http)、tcp://192.168.5.4:2376(即:https,需要配置证书才能使用)
- 已安装的 Docker 服务,默认不开启远程调用的端口(即:默认不开启 2375、2376 端口),如需开启,请参考下列配置:
- 以下以 Docker 服务的宿主机的 IP 是 192.168.5.4 为例,Docker 服务仅开启 监听 2375、2376 端口,不监听其他 IP (防止云服务器意外暴露 Docker 端口时,被其他人恶意访问,导致信息泄露)
- 编辑 Docker 服务
vim /lib/systemd/system/docker.service
- 默认 Docker 服务
[Unit] ... 省略 [Service] Type=notify ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock ... 省略 [Install] ... 省略
- 修改 Docker 服务
[Unit] ... 省略 [Service] Type=notify # 此处配置 Docker 监听的 端口 对应的 IP 是服务器的 内网IP,当且仅当使用 192.168.5.4:2375 才能与 Docker 进行远程通信 # 强烈不建议此处配置为 tcp://0.0.0.0:2375,是为了防止云服务器意外暴露 Docker 端口时,被其他人使用 公网IP 恶意访问,导致信息泄露 # 强烈不建议此处配置为 tcp://公网IP:2375,是为了防止云服务器意外暴露 Docker 端口时,被其他人使用 公网IP 恶意访问,导致信息泄露 # 如需监听公网 IP,请使用云服务安全组、服务器防火墙限制 IP 访问 Docker 端口,用于提高安全性 ExecStart=/usr/bin/dockerd -H tcp://192.168.5.4:2375 -H unix:///var/run/docker.sock ... 省略 [Install] ... 省略
- 支持 GitLab Runner 执行器:docker、docker+machine、kubernetes 等等
- 具体配置请参见 参考示例 的 docker_host 分支
方案 4:使用宿主机 docker.sock 提供 Docker 服务 构建 Docker 镜像
文档
介绍
执行 Docker 命令 时,Docker 命令行工具 会 检查 目录 /var/run/docker.sock、/run/docker.sock 是否存在,如果存在时,Docker 命令行工具会与之通信,用于完成 Docker 执行的命令
- Docker 构建时的环境是一个已经存在的环境,非独立环境
- 不需要 特权身份 运行 GitLab 流水线,不存在越权行为
- 需要在 GitLab Runner 执行器所在的宿主机安装 Docker 服务,并保持 Docker 正常运行
- 需要在 GitLab Runner 执行器配置文件(夹)路径挂载
- GitLab Runner Docker 执行器 文件(夹)路径挂载 配置,其他执行器配置雷同
配置文件位置:/etc/gitlab-runner/config.toml [[runners]] name = "lighthouse-docker" url = "https://jihulab.com/" ...省略 executor = "docker" [runners.docker] ...省略 volumes = ["/run/docker.sock:/run/docker.sock"] ...省略
- 支持 GitLab Runner 执行器:docker、docker+machine、kubernetes 等等
- 具体配置请参见 参考示例 的 docker_sock 分支
- GitLab Runner Docker 执行器 文件(夹)路径挂载 配置,其他执行器配置雷同
方案 5:使用 Shell 直接构建 Docker 镜像
直接使用 Shell 执行器构建 Docker 镜像,无需镜像
- Docker 构建时的环境是一个已经存在的环境,非独立环境,在 GitLab Runner 执行器宿主机上直接执行
- 需要在 GitLab Runner 执行器所在的宿主机安装 Docker 服务,并保持 Docker 正常运行
- 需要 GitLab Runner 运行时用户可正常执行 Docker 命令
- 支持 GitLab Runner 执行器:shell
- 具体配置请参见 参考示例 的 shell 分支