Dockerfile 中 ENTRYPOINT 和 CMD 的区别
在 Dockerfile 中,ENTRYPOINT 和 CMD 都用于指定容器启动时运行的命令,但它们在用途和行为上有关键区别:
✅ 1. CMD
- 作用:提供默认参数,可以被
docker run时的命令行参数所覆盖。 格式:
CMD ["executable", "param1", "param2"] # 推荐的 JSON 数组格式 CMD command param1 param2 # shell 格式,不推荐- 使用场景:当你希望容器有一个默认行为,但又允许用户在运行容器时替换这个行为时使用 CMD。
✅ 2. ENTRYPOINT
- 作用:设置容器启动时始终执行的命令,通常用于定义一个“主进程”。
格式:
ENTRYPOINT ["executable", "param1"] # 推荐的 JSON 数组格式 ENTRYPOINT command param1 # shell 格式- 使用场景:当你希望容器运行时总是执行特定程序(如脚本或二进制)时使用 ENTRYPOINT。
✅ 组合使用
ENTRYPOINT+CMD可以配合使用:ENTRYPOINT ["echo"] CMD ["Hello, World"]启动容器时,会执行:
echo "Hello, World"如果你执行:
docker run your_image Goodbye最终执行的命令将是:
echo "Goodbye"CMD 被当作 ENTRYPOINT 的参数使用。
⚠️ 注意事项
- 使用
ENTRYPOINT时不容易被docker run覆盖,除非显式用--entrypoint参数。 - 如果只设置了
CMD而没有ENTRYPOINT,则 CMD 会作为要执行的命令。
✅ 总结对比
| 项目 | CMD | ENTRYPOINT |
|---|---|---|
| 定义作用 | 默认命令或参数 | 容器启动时始终执行的主命令 |
| 是否可覆盖 | 可以被 docker run 覆盖 | 不能被 docker run 覆盖(除非用 --entrypoint) |
| 推荐用法 | 配合 ENTRYPOINT 传参数使用 | 定义固定行为,如运行服务或脚本 |