【问题标题】:When do you have to use `/bin/sh -c "..."` in the CMD directive in a Dockerfile?什么时候必须在 Dockerfile 的 CMD 指令中使用 `/bin/sh -c "..."`?
【发布时间】:2019-12-27 16:59:07
【问题描述】:

我一直在研究几个项目的Dockerfile 实现,我注意到其中一些以以下方式启动应用程序:

CMD executable

而其他人这样做:

CMD /bin/sh -c "executable"

我一直在为每个项目尝试两个版本,并没有真正注意到差异。

有区别吗?如果是,什么时候首选哪个版本?

【问题讨论】:

  • 我认为 docker 总是使用 /bin/sh 作为默认值,所以第一个更短

标签: docker dockerfile sh


【解决方案1】:

来自 docker 文档 (https://docs.docker.com/engine/reference/builder/):

  • CMD ["executable","param1","param2"](执行形式,这是首选形式)
  • CMD ["param1","param2"](作为 ENTRYPOINT 的默认参数)
  • CMD 命令 param1 param2(shell 形式)

...

注意:与 shell 形式不同,exec 形式不调用命令 贝壳。这意味着不会发生正常的外壳处理。为了 例如, CMD [ "echo", "$HOME" ] 不会在 $家。如果你想要外壳处理,那么要么使用外壳形式,要么 直接执行一个shell,例如:CMD [ "sh", "-c", "echo $HOME" ]。当使用 exec 形式并直接执行 shell 时,如 外壳形式的情况,它是外壳在做环境 变量扩展,而不是 docker。

所以

CMD executable

使用 shell 形式的已经隐式调用了 shell。所以没有理由显式调用一个。

【讨论】:

    猜你喜欢
    • 2011-02-20
    • 2021-09-19
    • 1970-01-01
    • 2011-04-28
    • 1970-01-01
    • 2013-04-30
    • 1970-01-01
    • 2014-02-03
    • 2011-01-22
    相关资源
    最近更新 更多