什么是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形式在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
指令?
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可执行文件的基础映像运行命令。
在Shell形式中,可以使用\(反斜杠)将单个RUN指令延续到下一行。
CMD
还有第三种形式:
CMD ["param1", "param2"](作为ENTRYPOINT的默认参数)
此外,如果要将它作为要覆盖的ENTRYPOINT
参数/参数使用,则需要Exec形式。
ENTRYPOINT
和CMD
以执行形式或者shell形式存在时它们是如何互相作用的。
来源: https://docs.docker.com/engine/reference/builder/#understand-how-cmd-and-entrypoint-interact