我正在尝试教我的Gitlab Runner映像从我的私有Docker Registry(在Google Cloud中运行的GCR)获取自定义生成器映像。
什么没有解决?
我使用正确设置的ServiceAccount创建了一个自定义的Gitlab Runner图像。我以非特权模式开始,但虫洞模式(通过docker.sock
)开始。在执行到该容器(基于gitlab/gitlab-runner:v11.3.0
)时,我必须认识到我无法在其中执行任何docker命令(既不是root用户,也不是gitlab-user)。 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,您可以通过before_script
文件中的.gitlab-ci.yml
块进行身份验证。解决了。
# 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和authenticate)-我希望在gitlab-runner映像中执行此操作。您知道如何实现这一目标吗?
答案 0 :(得分:1)
最后,我找到了完成此任务的方法。
GCP
IAM & Admin
中创建没有权限的服务帐户Storage Browser
中添加权限
Storage Object Admin
的权限本地 Docker 容器
library/docker
容器并执行到其中(使用Docker Wormhole Pattern docker.sock
卷安装)GCR
)
docker login -u _json_key --password-stdin https://eu.gcr.io < /etc/gitlab-runner/<MY_KEY>.json
docker pull <MY_GCR_IMAGE>
Gitlab config.toml 配置
[[runners]]
environment = ["DOCKER_AUTH_CONFIG={ \"auths\": { \"myregistryurl.com:port\": { \"auth\": \"<TOKEN-FROM-DOCKER-CONFIG-FILE>\" } } }"]
香草Gitlab转轮容器
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文件
GCP Container Registry
中的图片GCP
Storage Legacy Bucket Reader
中服务帐户的权限Storage Browser
自定义Docker Builder映像
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可以从您的私人GCR Docker Repo中提取您的自定义映像。此外,这些可拉动的自定义映像还能够与您的私有GCR Docker Repo进行对话,例如,将生成的映像推送到构建管道中。
那是相当复杂的东西。也许Gitlab将来会增强对此用例的支持。
答案 1 :(得分:0)
您是否尝试过使用Google cloudbuild? 我遇到了同样的问题,并像这样解决了它:
echo ${GCR_AUTH_KEY} > key.json
gcloud auth activate-service-account --key-file key.json
gcloud auth configure-docker
gcloud builds submit . --config=cloudbuild.yaml --substitutions _CI_PROJECT_NAME=$CI_PROJECT_NAME,_CI_COMMIT_TAG=${CI_COMMIT_TAG},_CI_PROJECT_NAMESPACE=${CI_PROJECT_NAMESPACE}
cloudbuild.yaml:
steps:
- name: gcr.io/cloud-builders/docker
id: builder
args:
- 'build'
- '-t'
- 'eu.gcr.io/projectID/$_CI_PROJECT_NAMESPACE-$_CI_PROJECT_NAME:$_CI_COMMIT_TAG'
- '.'
- name: gcr.io/cloud-builders/docker
id: tag-runner-image
args:
- 'tag'
- 'eu.gcr.io/projectID/$_CI_PROJECT_NAMESPACE-$_CI_PROJECT_NAME:$_CI_COMMIT_TAG'
- 'eu.gcr.io/projectID/$_CI_PROJECT_NAMESPACE-$_CI_PROJECT_NAME:latest'
images:
- 'eu.gcr.io/projectID/$_CI_PROJECT_NAMESPACE-$_CI_PROJECT_NAME:$_CI_COMMIT_TAG'
- 'eu.gcr.io/projectID/$_CI_PROJECT_NAMESPACE-$_CI_PROJECT_NAME:latest'
在gitlab-ci阶段只需使用google / cloud-sdk:alpine作为图片
答案 2 :(得分:0)
我也终于找到了一种方法。请检查this answer。这几乎是相同的问题,但是不允许将任何键存储在图像中。