7.5 ENTRYPOINT 入口点
何时使用 ENTRYPOINT:从“容器”到“命令”
如果说 CMD 是“容器中的默认程序”,那么 ENTRYPOINT 就是“把容器变成一个命令”。这个思维转变决定了你何时使用 ENTRYPOINT。
使用 ENTRYPOINT 的典型场景:
命令行工具:你想让镜像像
curl或wget一样使用ENTRYPOINT ["curl"] # docker run myimage http://example.com → curl http://example.com应用启动脚本:你有一个初始化脚本,需要接收命令行参数
ENTRYPOINT ["/app/entrypoint.sh"] # docker run myimage --debug → /app/entrypoint.sh --debug与 CMD 结合:ENTRYPOINT 定义入口,CMD 定义默认参数
ENTRYPOINT ["python", "app.py"] CMD ["--port", "8000"] # docker run myimage → python app.py --port 8000 # docker run myimage --port 9000 → python app.py --port 9000
对比 CMD:如果没有这些“把容器当命令用”的需求,通常使用 CMD 就足够了。
7.5.1 什么是 ENTRYPOINT
ENTRYPOINT 指定容器启动时运行的入口程序。与 CMD 不同,ENTRYPOINT 定义的命令不会被 docker run 的参数覆盖,而是 接收这些参数。
核心作用:让镜像像一个可执行程序一样使用,
docker run的参数作为这个程序的参数。
7.5.2 语法格式
exec 格式
ENTRYPOINT ["可执行文件", "参数1"]
✅推荐
shell 格式
ENTRYPOINT 命令 参数
⚠️ 不推荐
7.5.3 ENTRYPOINT vs CMD
核心区别
定位
固定的入口程序
默认参数
docker run 参数
追加为参数
完全覆盖
覆盖方式
--entrypoint
直接指定命令
适用场景
把镜像当命令用
提供默认行为
行为对比
7.5.4 场景一:让镜像像命令一样使用
需求:启动前准备
创建一个查询公网 IP 的 “命令” 镜像。
使用 CMD 的问题
使用 ENTRYPOINT 解决
交互图示
7.5.5 场景二:启动前的准备工作
需求
在启动主服务前执行初始化脚本(如数据库迁移、权限设置)。
实现方式
docker-entrypoint.sh:
工作流程
关键点
exec “$@”:用传入的参数替换当前进程,确保信号正确传递
条件判断:根据 CMD 不同执行不同逻辑
用户切换:使用
gosu切换用户(比su更适合容器)
7.5.6 场景三:带参数的应用
7.5.7 覆盖 ENTRYPOINT
使用 --entrypoint 参数覆盖:
7.5.8 ENTRYPOINT 与 CMD 组合表
无
无
无(容器无法启动)
无
["cmd", "p1"]
cmd p1
["ep", "p1"]
无
ep p1
["ep", "p1"]
["cmd", "p2"]
ep p1 cmd p2
ep p1 (shell)
["cmd", "p2"]
/bin/sh -c "ep p1"(CMD 被忽略)
⚠️ 注意:shell 格式的 ENTRYPOINT 会忽略 CMD!
7.5.9 最佳实践
1. 使用 exec 格式
2. 提供有意义的默认参数
3. 入口脚本使用 exec
4. 处理信号
确保 ENTRYPOINT 脚本能正确传递信号:
最后更新于