我想创建一个Docker Image,作为一个可执行文件,用户将一个令牌作为一个环境变量传递给它.可执行文件具有用户应通过停靠点CMD(通过Env进行认证来考虑git)的子命令.
然而,Docker没有将CMD附加到入口点.
Dockerfile的相关部分如下所示:
ENTRYPOINT ["/bin/sh","-c","/usr/bin/mycmd --token=$MY_TOKEN"]
CMD ["pull","stuff"]
所以如果这个容器执行没有任何CMD覆盖和秘密作为MY_TOKEN变量,我会期望
mycmd --token=secret pull stuff
被执行.如果用户启动具有覆盖的容器,例如
docker run -it -e MY_TOKEN=secret myimage push junk
我会期望的
mycmd --token=secret push junk
被执行.然而,如上所述,只有mycmd –token = secret被执行,CMD被忽略 – 无论我在启动时是否覆盖它,或者在Dockerfile中设置它.
最佳答案
使用/ bin / sh -c“脚本”语法,-c参数之后的任何内容都将成为脚本的参数.您可以使用$0和$@与他们的/ bin / sh脚本一起达到它们:
ENTRYPOINT ["/bin/sh","exec /usr/bin/mycmd --token=$MY_TOKEN $0 $@"]
CMD ["pull","stuff"]
请注意,您还可以将您的entrypoint更改为添加到运行exec /usr/bin/mycmd –token = $MY_TOKEN“$@”的映像的shell脚本,并使用docker的exec语法执行该shell脚本:
ENTRYPOINT ["/entrypoint.sh"]