我一直在研究几个项目的Dockerfile
实现,我注意到其中一些是通过以下方式启动应用程序的:
CMD executable
而其他人这样做:
CMD /bin/sh -c "executable"
我已经为每个项目尝试了两个版本,但并没有真正注意到它们之间的差异。
有区别吗?如果是这样,什么时候首选哪个版本?
答案 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
使用外壳程序形式的已经隐式调用了外壳程序。因此,没有理由显式调用一个。