Dockerfile CMD shell与exec表单

She*_*ena 18 docker dockerfile

sheller RUN和CMD语句的shell形式和exec形式之间有什么区别.

例如:

RUN [ "npm", "start" ]
Run Code Online (Sandbox Code Playgroud)

VS:

RUN npm start 
Run Code Online (Sandbox Code Playgroud)

eg2:

CMD ["python","my_script.py","argument"]
Run Code Online (Sandbox Code Playgroud)

VS:

CMD python my_script.py argument 
Run Code Online (Sandbox Code Playgroud)

Mat*_*ard 25

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要覆盖的参数/参数,则需要exec表单.

  • 我还想指出,使用 ENTRYPOINT 的 shell 形式可能意味着您[没有正确地将信号传播](https://hynek.me/articles/docker-signals/) 到您的应用程序,这可能会导致问题,特别是在 Kubernetes 集群中。 (15认同)
  • 仅复制并粘贴文档而没有进一步解释是没有用的! (4认同)
  • 这个评论比答案重要得多,答案只是重复文档 (3认同)
  • 文档中的“shell string munging”是什么意思? (3认同)