Google Cloud Build + Google Secret Manager替代问题

问题描述

我们有一个需要go get专用存储库的存储库。为此,我们使用SSH密钥访问私有存储库/模块。

我们正在使用Google Secret Manager存储此SSH密钥,并使用build-arg标志将其传递给Docker。现在,当我们在本地执行此操作时,Dockerfile将按预期的方式构建并运行。这是我们用于本地构建的命令:

export SSH_PRIVATE_KEY="$(gcloud secrets versions access latest --secret=secret-data)" && \
docker build --build-arg SSH_PRIVATE_KEY -t my-image .

但是,当我们尝试将此设置移至Google Cloud Build时,我们从Bitbucket中遇到了403个禁止的错误,这使我相信SSH密钥未正确读取或未正确格式化。

完整的403错误为:

https://api.bitbucket.org/2.0/repositories/my-repo?fields=scm: 403 Forbidden
Step #0 - "Build":  server response: Access denied. You must have write or admin access.

甚至更奇怪的是,当我运行Cloud Build本地仿真器时,使用以下命令可以正常工作:cloud-build-local --config=builder/cloudbuild-prod.yaml --dryrun=false .

我尝试了许多不同的格式和方法,因此出于绝望,我要求社区提供帮助。可能是什么问题?

这是我们的cloudbuild.yaml:

steps:
# Get secret
  - id: 'Get Secret'
    name: gcr.io/cloud-builders/gcloud
    entrypoint: 'bash'
    args:
      - '-c'
      - |
          gcloud secrets versions access latest --secret=secret-data > /workspace/SSH_PRIVATE_KEY.txt

# Build
  - id: 'Build'
    name: 'gcr.io/cloud-builders/docker'
    entrypoint: 'bash'
    args:
      - '-c'
      - |
          export SSH_PRIVATE_KEY=$(cat /workspace/SSH_PRIVATE_KEY.txt) &&
          docker build --build-arg SSH_PRIVATE_KEY -t my-image .

解决方法

使用Cloud Build,当您想获取本地linux变量而不是替代变量时,必须将$与另一个$隔开。看这个:

# Build
  - id: 'Build'
    name: 'gcr.io/cloud-builders/docker'
    entrypoint: 'bash'
    args:
      - '-c'
      - |
          export SSH_PRIVATE_KEY=$(cat /workspace/SSH_PRIVATE_KEY.txt) 
          docker build --build-arg $$SSH_PRIVATE_KEY -t my-image .

SSH_PRIVATE_KEY前面带有$$,表示:不要看替换变量,而要看linux变量。

我还要在导出行的末尾删除&&。管子|意思是:连续运行每个命令,限制每个命令的行返回

,

感谢所有帮助!这个很奇怪。事实证明,这不是Cloud Build或Secret Manager的问题,而是我使用的Dockerfile。

我没有使用下面的Dockerfile中的命令设置GOPRIVATE,而是使用了RUN export GOPRIVATE="bitbucket.org/odds"之类的语句。

万一有人再次遇到类似的情况,这是可以使用的完整Dockerfile。

FROM golang:1.15.1

WORKDIR $GOPATH/src/bitbucket.org/gml/my-srv

ENTRYPOINT ["./my-srv"]

ARG CREDENTIALS

RUN git config \
    --system \
    url."https://${CREDENTIALS}@bitbucket.org/".insteadOf \
    "https://bitbucket.org/"

RUN go env -w GOPRIVATE="bitbucket.org/my-team"

COPY . .

RUN make build

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...