Dockerfile CMD shell与exec的forms

docker RUN和CMD语句的shellforms和execforms有什么区别。

例如:

RUN [ "npm", "start" ] 

VS:

 RUN npm start 

eg2

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

VS:

 CMD python my_script.py argument 

shell表单和exec表单有两个区别。 根据文件,执行表格是首选的forms。 这是两个不同之处:

exec表单被parsing为一个JSON数组,这意味着你必须在单词中使用双引号(“)而不是单引号(')。

与shellforms不同,execforms不会调用命令shell。 这意味着正常的shell处理不会发生。 例如,CMD [“echo”,“$ HOME”]不会在$ HOME上进行variablesreplace。 如果你想要shell处理,那么要么使用shell的forms,要么直接执行一个shell,例如:CMD [“sh”,“-c”,“echo $ HOME”]。 当使用exec表单并直接执行一个shell时,就像在shell表单的情况下一样,shell是在执行环境variables扩展,而不是docker。

这里有一些额外的细节是:

execforms使得可以避免shellstring转换,并使用不包含指定的shell可执行文件的基本映像运行命令。

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

CMD还有第三种forms:

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

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