entrypoint 定义容器启动时必须执行的主程序,推荐使用 exec 格式(如 entrypoint ["nginx", "-g"])确保 pid 1 和信号传递;配合 cmd 提供可覆盖的默认参数;复杂逻辑可用 entrypoint.sh 封装并以 exec "$@" 结尾;调试时可用 --entrypoint 临时覆盖。
entrypoint 用于定义容器启动时必须执行的主程序,它决定了容器的“身份”和核心行为。推荐始终使用 exec 格式(json 数组写法),确保主进程获得 pid 1 并能正确接收系统信号。
用 exec 格式声明入口点
这是最安全、最标准的写法:
- 语法为 ENTRYPOINT ["可执行文件", "参数1", "参数2"]
- 例如:ENTRYPOINT ["nginx", "-g"] —— 表示容器默认以 nginx -g 启动
- 此时 CMD 可提供默认后续参数,如 CMD ["daemon off;"],最终运行 nginx -g "daemon off;"
- 若运行 docker run my-nginx -c /etc/nginx.conf,则实际执行 nginx -g -c /etc/nginx.conf(CMD 被替换)
搭配 CMD 提供可覆盖的默认参数
ENTRYPOINT 定义“做什么”,CMD 定义“怎么做(默认)”,两者配合提升灵活性:
- 只写 ENTRYPOINT:容器每次启动都固定执行该命令,无法通过 docker run 追加或修改参数
- ENTRYPOINT + CMD(exec 格式):CMD 的内容作为 ENTRYPOINT 的默认参数,且可在运行时被完整替换
- 错误示范:ENTRYPOINT nginx -g(shell 格式)——会启动 /bin/sh -c,导致 PID 不是 nginx,SIGTERM 无法传入,容器 docker stop 时可能强制终止
用入口脚本封装初始化逻辑
复杂场景下,建议把 ENTRYPOINT 指向一个 shell 脚本,统一处理环境检查、配置生成、依赖等待等:
- Dockerfile 中写:ENTRYPOINT ["./entrypoint.sh"],并确保脚本有执行权限(RUN chmod +x entrypoint.sh)
- 脚本开头必须是 #!/bin/sh,结尾必须是 exec "$@"(不是 "$@")
- exec "$@" 确保主应用进程接管 PID 1,支持优雅退出
- 脚本内可做:检查 $DB_HOST 是否设置、等待数据库就绪、用 envsubst 渲染配置模板等
运行时临时覆盖入口点
调试或应急时,可用 --entrypoint 参数绕过镜像中定义的 ENTRYPOINT:
- docker run --entrypoint /bin/sh my-app → 启动交互式 shell,跳过原入口逻辑
- docker run --entrypoint curl my-app http://host/health → 直接执行健康探测
- 注意:该覆盖只作用于单次运行,不影响镜像本身











