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

时间:2017-02-17 12:37:33

标签: docker dockerfile docker-container docker-image

我想创建一个Docker Image,它充当可执行文件,用户将令牌作为环境变量传递给它。可执行文件具有用户应通过docker CMD传递的子命令(通过Env考虑git和身份验证)。 但是,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中设置它。

2 个答案:

答案 0 :(得分:12)

使用/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脚本,并使用docker的exec语法执行该shell脚本:

ENTRYPOINT ["/entrypoint.sh"]

答案 1 :(得分:7)

如指定in the docker documentation,您指定一个调用shell的入口点(因此不是shell形式,而是exec形式)。参数传递给shell(因此被忽略);只有shell中的命令很重要。将切入点调用切换为:

后,您将看到问题已解决

ENTRYPOINT ["usr/bin/mycmd", "--token=$MY_TOKEN"]

在入口点调用shell是非常不鼓励的,并且只有当您想要避免图像用户将自定义参数附加到入口点时才会有用。

在互联网上见! :)