我想创建一个充当可执行文件的 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 中设置它。
使用
/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"]
ENTRYPOINT ["usr/bin/mycmd", "--token=$MY_TOKEN"]
互联网见! :)