ENTRYPOINT 是什么
把镜像固定成某个可执行程序:运行时追加的参数会附加到这个程序之后,而不是替换它。这样做的镜像用起来更像一个命令行工具,参数语义清晰。与默认命令配合时,入口程序负责确定执行什么,默认命令提供可被覆盖的参数。
基本信息
| 作用 | 固定容器启动的入口程序 |
|---|---|
| 推荐形式 | 参数数组形式,参数透传与信号处理更直接 |
| 参数传递 | 运行时追加的内容作为入口程序的参数 |
| 临时覆盖 | 运行时可用覆盖参数替换入口,仅用于调试 |
| 常见配套 | 入口脚本末尾用执行替换把控制权交给真正的服务进程 |
典型使用场景
- 命令行工具镜像:把镜像做成可执行命令,运行参数直接传给程序
- 统一启动脚本:入口脚本负责准备配置、等待依赖,再把控制权交给服务
- 多形态服务:同一镜像通过不同参数以不同模式运行,减少镜像数量
- 参数化部署:端口、日志级别、配置文件路径通过运行参数传入
- 权限与初始化:入口脚本完成初始化后,切换到非特权用户运行服务
常用示例
常用示例
ENTRYPOINT ["/usr/local/bin/entrypoint.sh"] # 固定入口脚本
CMD ["nginx", "-g", "daemon off;"] # 默认参数,可被覆盖
# 入口脚本结尾把控制权交给实际服务,保证信号能传到
# exec "$@"
# 临时覆盖入口进容器排查
docker run --rm --entrypoint /bin/sh app/web:1.0入口与默认命令的组合效果
| 运行命令 | 实际执行 | 说明 |
|---|---|---|
| 只给镜像名 | 入口程序加默认参数 | 镜像的默认行为 |
| 镜像名后跟参数 | 入口程序加新参数 | 默认参数被替换,入口不变 |
| 运行时覆盖入口 | 新程序加原有默认参数 | 原默认参数仍会作为参数传入 |
| 覆盖入口并给参数 | 新程序加新参数 | 两者都替换,调试常用 |
| 两者都未声明 | 镜像基础层的行为 | 容易出现容器启动即退出 |
写入口脚本的要点
- 脚本最后用执行替换启动服务,避免脚本成为中间层挡住信号
- 等待依赖要有超时与重试上限,别写成无限等待导致启动卡死
- 初始化动作要幂等,容器重启后重复执行不会出问题
- 需要降权的场景在脚本末尾切换身份,用专门的工具完成
- 脚本出错要返回非零退出码,便于外部判断与自动重启策略生效
入口脚本里若不使用执行替换,服务进程会变成子进程,停止容器时信号到不了服务,总要等超时被强杀。
命令字符串形式的入口会忽略运行时追加的参数与默认命令,表现为参数完全传不进去,参数化部署基本靠数组形式实现。