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 传参数使用 | 定义固定行为,如运行服务或脚本 |