关于docker:Dockerfile CMD shell与exec表单

Dockerfile CMD shell versus exec form

docker run和cmd语句的shell形式和exec形式有什么区别?

如:

1
RUN ["npm","start" ]

VS:

1
RUN npm start

Eg2:

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

VS:

1
CMD python my_script.py argument

shell窗体和exec窗体之间有两种不同。根据文档,exec表单是首选表单。这是两个不同之处:

The exec form is parsed as a JSON array, which means that you must use double-quotes (") around words not single-quotes (‘).

Unlike the shell form, the exec form does not invoke a command shell. This means that normal shell processing does not happen. For example, CMD ["echo","$HOME" ] will not do variable substitution on $HOME. If you want shell processing then either use the shell form or execute a shell directly, for example: CMD ["sh","-c","echo $HOME" ]. When using the exec form and executing a shell directly, as in the case for the shell form, it is the shell that is doing the environment variable expansion, not docker.

这里还有一些微妙之处:

The exec form makes it possible to avoid shell string munging, and to RUN commands using a base image that does not contain the specified shell executable.

In the shell form you can use a \ (backslash) to continue a single RUN instruction onto the next line.

还有第三种形式用于CMD

CMD ["param1","param2"] (as default parameters to ENTRYPOINT)

此外,如果您将Exec表单用作要覆盖的EDOCX1[2]的参数/参数,则EDOCX1[0]需要Exec表单。