何时必须在Dockerfile的CMD指令中使用`/ bin / sh -c“ ...”`?

时间:2019-08-22 11:16:30

标签: docker dockerfile sh

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

CMD executable

而其他人这样做:

CMD /bin/sh -c "executable"

我已经为每个项目尝试了两个版本,但并没有真正注意到它们之间的差异。

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

1 个答案:

答案 0 :(得分:2)

从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”]不会在   $ HOME。如果要进行外壳处理,请使用外壳形式或   直接执行外壳程序,例如:CMD [“ sh”,“-c”,“ echo $ HOME”   ]。当使用exec表单并直接执行shell时,如   外壳形式的情况,就是外壳在做环境   变量扩展,而不是docker。

所以

CMD executable
使用外壳程序形式的

已经隐式调用了外壳程序。因此,没有理由显式调用一个。