19

我想创建一个 Docker Image 作为可执行文件,用户将令牌作为环境变量传递给它。可执行文件具有用户应通过 dockers 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 中设置它。

4

2 回答 2

18

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

ENTRYPOINT ["/entrypoint.sh"]
于 2017-02-19T20:53:22.180 回答
6

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

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

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

网上见!:)

于 2017-02-17T14:32:05.747 回答