Google Cloud Build Docker 来自文件的 build-arg
Google Cloud Build Docker build-arg from file
我在使用 Google Cloud Build 时遇到问题。我无法通过 cloudbuild.yaml
将密钥传递给 docker
Google 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'
Docker 文件:
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
无效。
.ssh 目录需要有正确的权限
RUN mkdir -m 700 -p ~/.ssh &&
GCloud Docker Builder is using the Exec form of ENTRYPOINT。您来自 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
.
对于任何遇到步骤问题的人:
COPY id_rsa ~/.ssh/
~/.ssh/id_rsa
在 docker 构建中不持久存在的地方,对我有用的解决方法是先将文件复制到应用程序文件内的目录,然后将其复制到最终目录:
ADD id_rsa /app/id_rsa
RUN cp /app/id_rsa ~/.ssh/id_rsa
我不确定为什么会这样,但好吧,给你。
我在使用 Google Cloud Build 时遇到问题。我无法通过 cloudbuild.yaml
将密钥传递给 dockerGoogle 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'
Docker 文件:
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
无效。
.ssh 目录需要有正确的权限
RUN mkdir -m 700 -p ~/.ssh &&
GCloud Docker Builder is using the Exec form of ENTRYPOINT。您来自 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
.
对于任何遇到步骤问题的人:
COPY id_rsa ~/.ssh/
~/.ssh/id_rsa
在 docker 构建中不持久存在的地方,对我有用的解决方法是先将文件复制到应用程序文件内的目录,然后将其复制到最终目录:
ADD id_rsa /app/id_rsa
RUN cp /app/id_rsa ~/.ssh/id_rsa
我不确定为什么会这样,但好吧,给你。