通过exec将args传递到入口点的Cloud Build

问题描述

我有一个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更改了外壳程序,因此它将忽略原始的args: []。是否可以将这些args: []用于/usr/local/bin/firebase deploy命令?

解决方法

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

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

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

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