我正在尝试教我的 Gitlab Runner 镜像从我的私有(private) Docker 注册表(在 Google Cloud 中运行的 GCR)获取自定义构建器镜像。
什么没有解决? 我创建了一个自定义的 Gitlab Runner 镜像,并正确设置了 ServiceAccount。我从非特权模式开始,但采用虫洞模式(通过 docker.sock)。在执行该容器(基于 gitlab/gitlab-runner:v11.3.0 )时,我必须认识到我无法在其中执行任何 docker 命令(无论是作为 root 还是作为 gitlab-)用户)。 gitlab-runner 随后如何启动构建器容器远远超出了我的认知能力。 ;)
# got started via eu.gcr.io/my-project/gitlab-runner:0.0.5 which got taught the GCR credentials
stages:
- build
build:
image: docker pull eu.gcr.io/my-project/gitlab-builder-docker:0.0.2
stage: build
script:
# only for test if I have access to private docker registry
- docker pull eu.gcr.io/my-project/gitlab-builder-docker:0.0.1
效果如何?
据此tutorial您可以通过 .gitlab-ci.yml
文件中的 before_script
block 进行身份验证。成功了。
# got started via gitlab/gitlab-runner:v11.3.0
stages:
- build
before_script:
- apk add --update curl python which bash
- curl -sSL https://sdk.cloud.google.com | bash
- export PATH="$PATH:/root/google-cloud-sdk/bin"
- gcloud components install docker-credential-gcr
- gcloud auth activate-service-account --key-file=/key.json
- gcloud auth configure-docker --quiet
build:
image: docker:18.03.1-ce
stage: build
# only for test if I have access to private docker registry
- docker pull eu.gcr.io/my-project/gitlab-builder-docker:0.0.1
问题 这意味着我必须在每次构建运行中执行此操作(安装 gcloud 并进行身份验证) - 我更愿意在 gitlab-runner 镜像中执行此操作。您知道如何实现这一目标吗?
最佳答案
最后我找到了一种方法来完成这件事。
教普通 gitlab-runner 如何从您的私有(private) GCR Docker 存储库中提取
GCP
- 在
IAM & Admin
中创建没有权限的服务帐户 - 下载 Json key
- 在
Storage Browser
中添加权限- 选择保存图像的存储桶(例如eu.artifacts.my-project.appspot.com)
- 授予权限
Storage Object Admin
到服务帐户
本地Docker容器
- 启动
library/docker
容器并执行到其中(使用 Docker Wormhole 模式docker.sock
卷安装) - 登录
GCR
via(检查您的存储库的网址,在我的例子中,它位于欧洲,因此网址中的 eu 前缀)docker login -u _json_key --password-stdin https://eu.gcr.io < /etc/gitlab-runner/<MY_KEY>.json
- 通过某些
docker pull <MY_GCR_IMAGE>
验证它是否有效 - 复制~/.docker/config.json的内容
Gitlab config.toml配置
- 将以下内容添加到您的 config.toml 文件中
[[runners]] environment = ["DOCKER_AUTH_CONFIG={ \"auths\": { \"myregistryurl.com:port\": { \"auth\": \"<TOKEN-FROM-DOCKER-CONFIG-FILE>\" } } }"]
普通 Gitlab Runner 容器
- 像这样运行运行者
docker run -it \ --name gitlab-runner \ --rm \ -v <FOLDER-CONTAININNG-GITLAB-RUNNER-CONFIG-FILE>:/etc/gitlab-runner:ro \ -v /var/run/docker.sock:/var/run/docker.sock \ gitlab/gitlab-runner:v11.3.0
您的 .gitlab-ci.yml 文件
- 通过 .gitlab-ci.yml 验证已完成的工作
- 使用位于您私有(private)
GCP Container Registry
中的图像
- 使用位于您私有(private)
教您的构建器镜像如何推送到您的私有(private) GCR Docker 存储库
GCP
- 为您的服务帐户添加权限
- 授予权限
Storage Legacy Bucket Reader
到您的服务帐户Storage Browser
- 授予权限
自定义 Docker 构建器镜像
- 将您的服务帐户 key 文件添加到您的自定义镜像中
FROM docker:18.03.1-ce ADD key.json /<MY_KEY>.json
您的 .gitlab-ci.yml 文件
- 将以下脚本添加到您的
before_script
中部分docker login -u _json_key --password-stdin https://eu.gcr.io < /key.json
最终想法
现在,普通的 gitlab-runner 可以从您的私有(private) GCR Docker Repo 中提取您的自定义镜像。此外,这些可拉取的自定义镜像还能够与您的私有(private) GCR Docker Repo 进行通信,例如推送构建管道的生成镜像。
那是相当复杂的事情。也许 Gitlab 将来会增强对此用例的支持。
关于docker - 具有 GCP 凭据的 Gitlab Runner 镜像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52474255/