一尘不染

具有入口点变量扩展和CMD参数的Docker容器

docker

我想创建一个充当可执行文件的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变量,我希望

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中设置它。


阅读 222

收藏
2020-06-17

共1个答案

一尘不染

使用/bin/sh -c "script"语法时,-c参数之后的所有内容都将成为脚本的参数。您可以使用/ bin /
sh脚本$0并将其$@作为/ bin / sh脚本的一部分:

ENTRYPOINT ["/bin/sh", "-c", "exec /usr/bin/mycmd --token=$MY_TOKEN $0 $@"]
CMD ["pull", "stuff"]

请注意,您还可以将入口点更改为添加到运行的映像的exec /usr/bin/mycmd --token=$MY_TOKEN "$@"外壳程序脚本,然后使用docker的exec语法执行该外壳程序脚本:

ENTRYPOINT ["/entrypoint.sh"]
2020-06-17