2017-03-15 35 views
4

docker RUN和CMD语句的shell形式和exec形式之间有什么区别。Dockerfile CMD shell与exec形式

例如:

RUN [ "npm", "start" ] 

VS:

RUN npm start 

EG2

CMD ["python","my_script.py","argument"] 

VS:

CMD python my_script.py argument 

回答

4

shell表单和exec表单有两点区别。根据该文件,执行表格是首选表格。这些是两个区别:

exec表单被解析为JSON数组,这意味着您必须在单词中使用双引号(“)而非单引号(')。

与shell窗体不同,exec窗体不会调用命令shell。这意味着正常的shell处理不会发生。例如,CMD [“echo”,“$ HOME”]不会在$ HOME上执行变量替换。如果你想要shell处理,那么要么使用shell的形式,要么直接执行一个shell,例如:CMD [“sh”,“-c”,“echo $ HOME”]。当使用exec表单并直接执行一个shell时(如shell格式的情况),它是在执行环境变量扩展的shell,而不是docker。

一些额外这里微妙之处是:

的EXEC形式使得能够避免壳串改写(munging),并运行使用不包含指定壳可执行基本图像的命令。

在shell形式中,您可以使用\(反斜杠)将单个RUN指令继续到下一行。

还为CMD第三种形式:

CMD [ “参数1”, “参数2”](作为默认参数入口点)

https://docs.docker.com/engine/reference/builder/#run
https://docs.docker.com/engine/reference/builder/#cmd