最后更新于

Docker中CMD与ENTRYPOINT的区别


在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镜像的镜像层次结构:

https://hub.docker.com/layers/library/nginx/1.22.1/images/sha256-9081064712674ffcff7b7bdf874c75bcb8e5fb933b65527026090dacda36ea8b?context=explore