docker - 如何安全地从 GitLab Runner KubernetesExecutor pod 推送到私有(private)容器注册表?

标签 docker kubernetes continuous-integration gitlab-ci gitlab-ci-runner

目标

构建一个 CI/CD 管道,可以使用具有特定项目结构的多个 GitLab 存储库。为此,构建了一个带有 Python 代码的 Docker 容器,然后安全地推送到 Google Cloud 的 Container Registry。

设置

  • KubernetesExecutor 使用 Helm chart 安装在 Kubernetes Engine 上。由 GitLab 提供。
  • 构建过程的基础镜像(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 图表,这似乎还不可能。

    笔记
  • 可以在 GitLab CI 中设置 protected 环境变量,但我宁愿不这样做,因为它们更难维护。
  • 我调查过this答案,但这表示我需要为我的 Docker 镜像添加一个 key 。
  • 查看了GitLab documentation关于使用私有(private)容器注册表,但似乎并没有更进一步。
  • 例如,当它必须在构建过程中连接到数据库时,就会出现类似的问题。
  • 最佳答案

    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/

    相关文章:

    docker - kubernetes 上的 kafka 无法生成/使用主题(ClosedChannelException、ErrorLoggingCallback)

    svn - 在 Jenkins 中为多个分支重用测试套件?

    build - 如何从 Jenkins 作业更改 Artifactory 中的现有构建状态

    c++ - 如何分离不同配置的 Makefile 构建输出?

    docker - Magit无法连接到docker内的emacsclient?

    Kubernetes 为同一个 Deployment 报告不同的 apiVersion

    ubuntu - docker-compose 创建 root 拥有的文件

    Kubernetes 使用 CronJob 运行作业

    docker - 访问docker容器中的非IP接口(interface)

    shell - 如何从 'docker run .... [command]' 追加/修改 docker 容器中的文件