在容器化技术中(尤其是 Docker 和 Kubernetes),ENTRYPOINT 和 CMD 是两个紧密相关但功能不同的指令,它们共同决定了容器启动时的执行行为。
核心关系总结

此外,k8s 中的 command 相当于 dockerfile 中的 ENTRYPOINT。k8s 中的 args 相当于 dockerfile 中的 CMD。
详细解析
1. ENTRYPOINT - 容器的"不可变核心"
-
定义容器的主执行程序
-
通常不会在运行时被覆盖
-
指定容器运行的基础命令
-
两种格式:
# 1. Exec 格式(推荐) ENTRYPOINT ["nginx", "-g", "daemon off;"] # 2. Shell 格式(不推荐) ENTRYPOINT nginx -g 'daemon off;'
2. CMD - 容器的"可变参数"
-
定义默认参数(可被运行时覆盖)
-
作为 ENTRYPOINT 的补充
-
三种格式:
# 1. Exec 格式(推荐) CMD ["-c", "app.conf"] # 2. Shell 格式 CMD -c app.conf # 3. 参数列表格式 CMD -c app.conf
工作模式(三种组合)
模式1:ENTRYPOINT + CMD(最佳实践)
ENTRYPOINT ["nginx"] # 主程序
CMD ["-c", "/etc/nginx.conf"] # 默认参数
运行结果:nginx -c /etc/nginx.conf
覆盖 CMD:docker run <image> -c /custom.conf
→ 新命令:nginx -c /custom.conf
模式2:只有 ENTRYPOINT
ENTRYPOINT ["nginx", "-g", "daemon off;"]
特点:
- 每次运行都执行相同命令
- 运行时参数会被追加(而非覆盖)
docker run <image> -v # 会执行:nginx -g 'daemon off;' -v
模式3:只有 CMD
CMD ["nginx", "-g", "daemon off;"]
特点:
- 相当于提供默认命令
- 运行时可以完全覆盖
docker run <image> /bin/bash # 完全替换为 bash
覆盖规则
| 场景 | 命令 | Kubernetes 中的等效写法 | 结果 |
|---|---|---|---|
| 基础命令 | docker run <image> | args: [] | 执行 ENTRYPOINT+CMD |
| 覆盖 CMD | docker run <image> arg1 | args: ["arg1"] | ENTRYPOINT + arg1 |
| 覆盖 ENTRYPOINT | docker run --entrypoint bin/sh <image> | command: ["/bin/sh"] | 使用新命令 |
| 双覆盖 | docker run --entrypoint bin/sh <image> -c ls | command: ["/bin/sh"], args: ["-c","ls"] | 执行 sh -c ls |
即,k8s 中的 command 相当于 dockerfile 中的 ENTRYPOINT。k8s 中的 args 相当于 dockerfile 中的 CMD。
最佳实践
| 需求 | 推荐方案 |
|---|---|
| 需要固定主程序+可变参数 | ENTRYPOINT + CMD |
| 严格限制容器行为 | 仅 ENTRYPOINT |
| 镜像作为通用工具 | 仅 CMD |
| 需要预启动逻辑 | ENTRYPOINT 指向自定义脚本 |
811

被折叠的 条评论
为什么被折叠?



