问题描述
我有一个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之类的事情。)