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 ["param1","param2"] (as default parameters to ENTRYPOINT)
此外,如果您将Exec表单用作要覆盖的EDOCX1[2]的参数/参数,则EDOCX1[0]需要Exec表单。