![](/img/trans.png)
[英]Dockerfile - exec form of ENTRYPOINT and shell form of CMD
[英]Differences Between Dockerfile Instructions in Shell and Exec Form
shell和exec形式有什么区别
CMD
:
CMD python my_script.py arg
对比
CMD ["python", "my_script.py", "arg"]
ENTRYPOINT
:
ENTRYPOINT ./bin/main
对比
ENTRYPOINT ["./bin/main"]
和RUN
:
RUN npm start
对比
RUN ["npm", "start"]
Dockerfile
指令?
shell形式和exec形式之间有两个不同之处。 根据文档 ,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表单可以避免shell字符串重写,并使用不包含指定shell可执行文件的基本映像来运行RUN命令。
在shell形式中,您可以使用\\(反斜杠)将单个RUN指令继续到下一行。
CMD
还有第三种形式:
CMD [“param1”,“param2”](作为ENTRYPOINT的默认参数)
此外,如果您将CMD
用作要覆盖的ENTRYPOINT
参数/参数,则需要执行此形式。
在 docker 文档中,有一个表格总结了ENTRYPOINT
和CMD
在 exec 表单或 shell 表单中如何交互:
资料来源: https://docs.docker.com/engine/reference/builder/#understand-how-cmd-and-entrypoint-interact
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.