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 formshell 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

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐