我想创建一个充当可执行文件的Docker映像,用户为其传递令牌作为环境变量。可执行文件具有用户应通过dockers CMD传递的子命令(认为git通过Env进行身份验证)。但是,Docker不会将CMD附加到入口点。我的Dockerfile的相关部分如下所示:
ENTRYPOINT ["/bin/sh", "-c", "/usr/bin/mycmd --token=$MY_TOKEN"] CMD ["pull", "stuff"]
因此,如果执行此容器时没有任何CMD覆盖并且secret作为MY_TOKEN变量,我希望
secret
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中设置它。
mycmd --token=secret
使用/bin/sh -c "script"语法时,-c参数之后的所有内容都将成为脚本的参数。您可以使用/ bin / sh脚本$0并将其$@作为/ bin / sh脚本的一部分:
/bin/sh -c "script"
-c
$0
$@
ENTRYPOINT ["/bin/sh", "-c", "exec /usr/bin/mycmd --token=$MY_TOKEN $0 $@"] CMD ["pull", "stuff"]
请注意,您还可以将入口点更改为添加到运行的映像的exec /usr/bin/mycmd --token=$MY_TOKEN "$@"外壳程序脚本,然后使用docker的exec语法执行该外壳程序脚本:
exec /usr/bin/mycmd --token=$MY_TOKEN "$@"
ENTRYPOINT ["/entrypoint.sh"]