CMD指令用于指定容器运行时默认执行的前台命令及参数,必须以前台方式持续运行,推荐使用exec格式如["nginx","-g","daemon off;"]以确保信号正确传递。

在 Dockerfile 中使用 CMD 指令配置 Web 服务器启动参数,核心是**指定容器运行时默认执行的命令及其参数**,且该命令应以前台方式持续运行,否则容器会立即退出。
CMD 的作用和基本写法
CMD 定义容器启动时的默认命令,它不会在构建阶段执行,只在 docker run 时生效。推荐使用 exec 形式(数组语法),避免 shell 解析带来的问题:
CMD ["nginx", "-g", "daemon off;"]
这种写法直接调用可执行文件,参数清晰,信号(如 SIGTERM)能正确传递给主进程,对 Web 服务器至关重要。
常见 Web 服务器的 CMD 配置示例
不同服务器需确保以**前台模式运行**,禁止后台化(如 nginx -d、httpd -D FOREGROUND 必须显式启用):
-
Nginx:禁用守护进程模式
CMD ["nginx", "-g", "daemon off;"] -
Apache httpd:使用前台启动标志
CMD ["httpd", "-D", "FOREGROUND"] -
Python Flask(使用 gunicorn):绑定到
0.0.0.0:5000并前台运行CMD ["gunicorn", "--bind", "0.0.0.0:5000", "--workers", "2", "app:app"] -
Node.js(Express):直接运行入口文件(需确保不调用
process.exit()或意外退出)CMD ["node", "server.js"]
CMD 与 ENTRYPOINT 的配合使用
若需固定执行环境(如始终用 gunicorn 启动),建议将可变部分留给 CMD,固定部分用 ENTRYPOINT:
ENTRYPOINT ["gunicorn"] CMD ["--bind", "0.0.0.0:8000", "app:application"]
这样既保证了命令结构统一,又允许在 docker run 时覆盖 CMD 参数,例如:
docker run myweb --bind 0.0.0.0:9000 app:application
避坑要点
- 不要用
CMD nginx这类 shell 形式(CMD nginx -g "daemon off;"),它会通过/bin/sh -c启动,导致 PID 1 不是 Web 进程,信号无法正确接收 - 确认配置文件路径正确(如
nginx.conf已 COPY 到镜像中),CMD 只负责启动,不处理配置加载 - 端口必须监听
0.0.0.0(而非127.0.0.1),否则容器内无法被外部访问 - 避免在 CMD 中使用
sleep infinity或tail -f /dev/null等伪前台方式——这不是真正的 Web 服务运行

















