【问题标题】:Cloud Build passing args to an entrypoint with execCloud Build 使用 exec 将 args 传递到入口点
【发布时间】:2020-08-20 15:26:47
【问题描述】:

我有一个 Dockerfile,其中包含以下使用 exec 的 ENTRYPOINT 命令。

FROM node:10-alpine
RUN apk add ca-certificates
RUN npm install -g firebase-tools

COPY --from=gcr.io/berglas/berglas:latest /bin/berglas /bin/berglas

ENV FIREBASE_TOKEN ""

ENTRYPOINT exec /bin/berglas exec -- /usr/local/bin/firebase

cloudbuild.yaml 我有以下步骤,但在args: [] 中传递的参数没有得到尊重。

  - name: firebase-tools
    dir: '/workspace/functions'
    args: ['deploy', '-P', '${_FIREBASE_PROJECT_NAME}']
    env:
      - 'FIREBASE_TOKEN=sm://$PROJECT_ID/firebase-ci-token'

因为exec 更改了shell,所以它忽略了原来的args: []。有没有办法将这些args: [] 应用于/usr/local/bin/firebase deploy 命令?

【问题讨论】:

  • 您能否详细说明您想要实现的目标?
  • 当然。 berglas 正在从 Google 机密管理器中提取机密,并在容器环境中以 FIREBASE_TOKEN 的形式提供。在berglas 完成它的工作之后,我想调用/usr/local/bin/firebase 并使用从cloudbuild.yaml 文件[ 'deploy', '-P', '${_FIREBASE_PROJECT_NAME} ] 传入的动态参数。 args 似乎只是被容器忽略了。我假设这是因为 exec 破坏了 shell。

标签: docker exec google-cloud-build


【解决方案1】:

您的实际问题是您使用来自ENTRYPOINT 的字符串。这会将命令字符串包装在sh -c '...' 中,这将忽略作为命令部分传递的任何其他参数。 ENTRYPOINT 必须使用 JSON 数组语法来获取 CMD 中的附加参数。

ENTRYPOINT ["/bin/berglas", "exec", "--", "/usr/local/bin/firebase"]

由于此表单没有 shell 包装器(它只是直接运行命令),因此此处不需要外部 exec

(我会考虑重新排列它,以便您拥有CMD ["firebase"],并且ENTRYPOINT 行以-- 分隔符结尾。然后CMD 是一个完整的命令,您可以轻松地执行诸如运行调试shell 之类的操作在环境包装器中。)

【讨论】:

  • 这行得通,谢谢。所以根据您的考虑,docker 文件的底部是否看起来像 ENTRYPOINT ["/bin/berglas", "exec", "--"] \n CMD ["firebase"]
  • 没错。这些组合在一起形成一个命令行。
猜你喜欢
  • 2018-06-18
  • 1970-01-01
  • 2021-09-11
  • 1970-01-01
  • 2021-02-01
  • 1970-01-01
  • 2019-11-27
  • 2010-10-02
  • 1970-01-01
相关资源
最近更新 更多