CSDN 中文章不一定能及时更新,欢迎点击前往我的博客查看最新版本:许盛的博客
Dockerfile
中的 CMD
是个非常重要的指令,主要用于为容器提供启动命令,但是写法上有好几种方式,一段时间不看的话,容易忘记,记录一下作为备忘。
可以直接参考官方文档中对 CMD
的讲解:https://docs.docker.com/engine/reference/builder/#cmd
CMD
命令的写法有三种格式:
CMD ["executable", "param1", "param2"]
: 这种写法叫做exec form
,也是最为推荐的一种写法CMD ["param1", "param2"]
这种写法会作为ENTRYPOINT
的默认参数使用CMD command param1 param2
:这种写法叫做shell form
。
在上面的用法中,最重要的就是需要理解 exec form
和 shell form
的区别。
举个例子,以 nginx
镜像为例:
FROM nginx
MAINTAINER https://www.xuxusheng.com
CMD ["nginx", "-g", "daemon off;"]
上面这种写法就是 exec form
,在运行的容器中,pid 为 1 的主进程是 nginx。
再换一种写法:
FROM nginx
MAINTAINER https://www.xuxusheng.com
CMD nginx -g "daemon off;"
这种写法就是 shell form
,此时运行的容器中,pid 为 1 的进程就变成了 /bin/sh -c nginx -g "daemon off;"
。
推荐使用 exec form
形式,将实际的应用程序作为主进程,而不是 sh
作为主进行,避免一些信号传递的问题,具体可以参考:Dockerfile 中 CMD 为什么要避免使用 sh -c