具有入口点可变扩展和CMD参数的Docker容器
我想创build一个Docker Image作为一个可执行文件,用户将一个令牌作为环境variables传递给它。 可执行文件有子命令,用户应该通过docker CMD(通过Envauthenticationgit)。 但是,Docker不会将CMD追加到入口点。 我的Dockerfile的相关部分如下所示:
ENTRYPOINT ["/bin/sh", "-c", "/usr/bin/mycmd --token=$MY_TOKEN"] CMD ["pull", "stuff"]
所以如果这个容器被执行没有任何CMD覆盖和secret
作为MY_TOKENvariables,我期望
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 "script"
语法,在-c
参数之后的任何东西都会成为脚本的参数。 您可以使用$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 "$@"
的映像中添加的shell脚本,并使用exec /usr/bin/mycmd --token=$MY_TOKEN "$@"
的exec语法执行该shell脚本:
ENTRYPOINT ["/entrypoint.sh"]
如docker文档中指定的那样,您正在指定一个调用shell的入口点(因此不是以shell的forms,而是以exec的forms)。 parameter passing给shell(因此被忽略); 只有shell中的命令很重要。 将您的入口点呼叫切换至:您将看到您的问题解决:
ENTRYPOINT ["usr/bin/mycmd", "--token=$MY_TOKEN"]
在入口点调用一个shell是非常令人气馁的,只有当你想避免图像的用户将自定义参数添加到你的入口点时才是有用的。
在interwebs中看到你! 🙂