目标
构建一个 CI/CD 管道,可以使用具有特定项目结构的多个 GitLab 存储库。为此,构建了一个带有 Python 代码的 Docker 容器,然后安全地推送到 Google Cloud 的 Container Registry。
设置
runners.image
中的 values.yaml
)是自定义镜像,因为这有助于自动容器化提供的存储库。 值得一提的原因是,它来自与应该将图像推送到的同一私有(private)存储库。 问题
如何在不向 Docker 镜像添加服务帐户 key 的情况下将镜像推送到 Container Registry(否则,请说服我这不是坏习惯)?
代码
.gitlab-ci.yml
services:
- docker:19.03.1-dind
stages:
- build
build:
stage: build
script:
- docker build -t ${CONTAINER_REGISTRY}/pyton-container-test:latest .
# This line is where I'd need to use `docker login`, I guess.
- docker push ${CONTAINER_REGISTRY}/python-container-test:latest
values.yaml (Helm)
值得一提的是,GitLab Runner 设置了以下环境变量:
runners:
env:
DOCKER_DRIVER: overlay2
DOCKER_HOST: tcp://localhost:2375
DOCKER_TLS_CERTDIR: ""
CONTAINER_REGISTRY: eu.gcr.io/<project_id>
解决方案的方向
我认为我应该能够将 Kubernetes 集群中的 secret 挂载到 GitLab Runner 构建 pod,但我似乎找不到这样做的方法。然后,我应该能够将以下行添加到
.gitlab-ci.yml
:cat mounted_secret.json | docker login -u _json_key --password-stdin https://eu.gcr.io
设置
config.toml
使用 secret volume应该管用。但是,使用 Helm 图表,这似乎还不可能。笔记
最佳答案
default Helm chart 是不可能的由 GitLab 提供。但是,有一个解决方法当你定制他们的。
在 templates/configmap.yaml
,可以编辑entrypoint
.最后,runner 开始如下:
# Start the runner
exec /entrypoint run --user=gitlab-runner \
--working-directory=/home/gitlab-runner
为此,请使用
config.toml
根据提供的 values.yaml
生成(使用正确的 Runner token )。这意味着在这一步之前,我们可以编辑 config.toml
到我们的需要。就我而言,我只是添加了:echo " [[runners.kubernetes.volumes.secret]]" >> ${CONFIG_FILE}
echo " name = \"{{ .Values.secretName }}\"" >> ${CONFIG_FILE}
echo " mount_path = \"/keys\"" >> ${CONFIG_FILE}
echo " read_only = true" >> ${CONFIG_FILE}
在哪里
${CONFIG_FILE}
是 /home/gitlab-runner/.gitlab-runner/config.toml
.最后,您可以使用以下命令部署 GitLab Runner:
$ helm install project_name -f values.yaml <path to chart>
关于docker - 如何安全地从 GitLab Runner KubernetesExecutor pod 推送到私有(private)容器注册表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60542643/