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

问题描述 投票:0回答:2

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

docker dockerfile docker-container docker-image docker-cmd
2个回答
21
投票

使用

/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"]

6
投票

正如 docker 文档中所指定的那样,您正在指定一个调用 shell 的入口点(因此不是以 shell 形式,而是以 exec 形式)。参数被传递到 shell(因此被忽略);只有 shell 中的命令才重要。将入口点调用切换到以下位置后,您将看到问题得到解决:

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



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

互联网见! :)

© www.soinside.com 2019 - 2024. All rights reserved.