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