繁体   English   中英

Shell 和 Exec 表单中的 Dockerfile 指令之间的差异

[英]Differences Between Dockerfile Instructions in Shell and Exec Form

shellexec形式有什么区别

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 文档中,有一个表格总结了ENTRYPOINTCMD在 exec 表单或 shell 表单中如何交互:

在此处输入图像描述

资料来源: https://docs.docker.com/engine/reference/builder/#understand-how-cmd-and-entrypoint-interact

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM