【问题标题】:Google Cloud Build Docker build-arg from file来自文件的 Google Cloud Build Docker build-arg
【发布时间】:2019-03-10 04:50:01
【问题描述】:

我在使用 Google Cloud Build 时遇到问题。我无法通过 cloudbuild.yaml 将密钥传递给 docker

谷歌 buildfile.yaml:

- name: 'gcr.io/cloud-builders/gcloud'
  args:
  - kms
  - decrypt
  - --ciphertext-file=A.enc
  - --plaintext-file=/root/.ssh/id_rsa
  - --location=global
  - --keyring=keyringxxx
  - --key=keyxxx
  volumes:
  - name: 'ssh'
    path: /root/.ssh
- name: 'gcr.io/cloud-builders/docker'
  args: [
    'build', '.',
    '-t', 'gcr.io/$PROJECT_ID/xxx:latest',
    '--build-arg', 'READ_KEY=`cat /root/.ssh/id_rsa`'
  ]
  volumes:
  - name: 'ssh'

Dockerfile:

FROM golang:1.11 AS builder

ARG READ_KEY
RUN mkdir -p ~/.ssh &&  \
    echo "$READ_KEY" > ~/.ssh/id_rsa && \
    chmod 0600 ~/.ssh/id_rsa && \
    ssh-keyscan github.com >> /root/.ssh/known_hosts && \
    git config --global url.ssh://git@github.com/XXXX.insteadOf https://github.com/XXXX

......

上面的代码失败了。 cat 不起作用。

【问题讨论】:

    标签: docker go dockerfile google-cloud-build


    【解决方案1】:

    .ssh 目录需要有正确的权限

    RUN mkdir -m 700 -p ~/.ssh &&  
    

    【讨论】:

      【解决方案2】:

      GCloud Docker Builder 使用 ENTRYPOINT 的 Exec 形式。您来自 cloudbuild.yaml 的参数不会被传递给 shell,因此您的 cat 将不会被执行。

      为什么不指示 KMS 将id_rsa 直接写入/workspace 并完全取消ssh 卷?

      - name: 'gcr.io/cloud-builders/gcloud'
        args:
        - kms
        - decrypt
        - --ciphertext-file=A.enc
        - --plaintext-file=/workspace/id_rsa
        - --location=global
        - --keyring=keyringxxx
        - --key=keyxxx
      - name: 'gcr.io/cloud-builders/docker'
        args: [
          'build', '.',
          '-t', 'gcr.io/$PROJECT_ID/xxx:latest'
        ]
      

      Dockerfile 变成:

      FROM golang:1.11 AS builder
      
      RUN mkdir -p ~/.ssh
      COPY id_rsa ~/.ssh/
      RUN ssh-keyscan github.com >> ~/.ssh/known_hosts && \
          chmod -R 0600 ~/.ssh/ && \
          git config --global url.ssh://git@github.com:.insteadOf https://github.com
      

      不要忘记将 .gitconfig 挂载到额外的构建步骤中。我只是将它作为我的 CI 构建脚本的一部分,而不需要额外的 volume

      【讨论】:

        【解决方案3】:

        对于步骤有问题的任何人:

        COPY id_rsa ~/.ssh/
        

        ~/.ssh/id_rsa 在 docker build 中不是持久存在的,对我有用的解决方法是首先将文件复制到 App 文件中的目录,然后将其复制到最终目录:

        ADD id_rsa /app/id_rsa
        RUN cp /app/id_rsa ~/.ssh/id_rsa
        

        我不知道为什么这会奏效,但是很好,给你。

        【讨论】:

          猜你喜欢
          • 2021-03-06
          • 1970-01-01
          • 1970-01-01
          • 2017-07-06
          • 2018-06-27
          • 2020-04-19
          • 1970-01-01
          • 2019-12-30
          • 2019-12-02
          相关资源
          最近更新 更多