在Docker容器化开发中,CMD和ENTRYPOINT是两个重要的指令 🐳,它们都用于指定容器启动时执行的命令,但行为方式有着重要区别。
🔍 核心区别
CMD指令
- 特点:可被 docker run的启动参数覆盖
- 用法:CMD ["/script.sh"]
- 行为:如果运行时提供了命令参数,CMD会被完全替换
ENTRYPOINT指令
- 特点:作为固定入口点,不会被覆盖
- 用法:ENTRYPOINT ["/script.sh"]
- 行为:docker run的启动参数会作为ENTRYPOINT的参数传递
⚙️ Kubernetes配置示例
在K8s中对应CMD的配置:
apiVersion: v1
kind: Pod
metadata:
  name: print-pod
spec:
  containers:
  - name: print-container
    image: my-image:latest
    command: ["/usr/local/bin/python"]
    args: ["/print.py", "hello k8s"]💡 说明:这相当于覆盖原有的CMD命令
📋 实际案例
Nginx的CMD示例
CMD ["nginx" "-g" "daemon off;"]nginx-1.22.1的docker镜像的镜像层次结构: