docker - 具有 GCP 凭据的 Gitlab Runner 镜像

标签 docker gitlab gitlab-ci gitlab-ci-runner

我正在尝试教我的 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

  1. IAM & Admin中创建没有权限的服务帐户
  2. 下载 Json key
  3. Storage Browser中添加权限
    1. 选择保存图像的存储桶(例如eu.artifacts.my-project.appspot.com)
    2. 授予权限 Storage Object Admin到服务帐户

本地Docker容器

  1. 启动library/docker容器并执行到其中(使用 Docker Wormhole 模式 docker.sock 卷安装)
  2. 登录GCR via(检查您的存储库的网址,在我的例子中,它位于欧洲,因此网址中的 eu 前缀) docker login -u _json_key --password-stdin https://eu.gcr.io < /etc/gitlab-runner/<MY_KEY>.json
  3. 通过某些 docker pull <MY_GCR_IMAGE> 验证它是否有效
  4. 复制~/.docker/config.json的内容

Gitlab config.toml配置

  1. 将以下内容添加到您的 config.toml 文件中 [[runners]] environment = ["DOCKER_AUTH_CONFIG={ \"auths\": { \"myregistryurl.com:port\": { \"auth\": \"<TOKEN-FROM-DOCKER-CONFIG-FILE>\" } } }"]

普通 Gitlab Runner 容器

  1. 像这样运行运行者 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 文件

  1. 通过 .gitlab-ci.yml 验证已完成的工作
    1. 使用位于您私有(private) GCP Container Registry 中的图像

教您的构建器镜像如何推送到您的私有(private) GCR Docker 存储库

GCP

  1. 为您的服务帐户添加权限
    1. 授予权限 Storage Legacy Bucket Reader到您的服务帐户 Storage Browser

自定义 Docker 构建器镜像

  1. 将您的服务帐户 key 文件添加到您的自定义镜像中 FROM docker:18.03.1-ce ADD key.json /<MY_KEY>.json

您的 .gitlab-ci.yml 文件

  1. 将以下脚本添加到您的 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/

相关文章:

python-3.x - Nginx proxy_pass 到 docker 容器不起作用

ubuntu - 找不到包语言包-en

GitLab 无法自动 merge 。 merge 请求包含必须解决的 merge 冲突

node.js - 在 gitLab CI YML 中获取 package.json 的值

nginx - 使用gitlab的Nginx服务另一个应用程序

docker-compose 卷即使从初始化也是空的

php - 在Wordpress Docker容器上未检测到pdo_mysql扩展

docker - gitlab-ci.yml部署在多个主机上

version-control - 从 bitbucket 迁移到 GitLab

docker - 如何使用docker executor将参数传递给gitlab-ci中的docker命令