首页/云/Docker 容器速查/ENTRYPOINT 固定入口点
镜像与构建107 条

ENTRYPOINT 固定入口点

把镜像固定成某个可执行程序:docker run 追加的命令行参数会附加到 ENTRYPOINT 之后,适合做 CLI 型镜像。

Docker 容器速查云更新于 2026-10-13

ENTRYPOINT 是什么

把镜像固定成某个可执行程序:运行时追加的参数会附加到这个程序之后,而不是替换它。这样做的镜像用起来更像一个命令行工具,参数语义清晰。与默认命令配合时,入口程序负责确定执行什么,默认命令提供可被覆盖的参数。

基本信息

作用固定容器启动的入口程序
推荐形式参数数组形式,参数透传与信号处理更直接
参数传递运行时追加的内容作为入口程序的参数
临时覆盖运行时可用覆盖参数替换入口,仅用于调试
常见配套入口脚本末尾用执行替换把控制权交给真正的服务进程

典型使用场景

  • 命令行工具镜像:把镜像做成可执行命令,运行参数直接传给程序
  • 统一启动脚本:入口脚本负责准备配置、等待依赖,再把控制权交给服务
  • 多形态服务:同一镜像通过不同参数以不同模式运行,减少镜像数量
  • 参数化部署:端口、日志级别、配置文件路径通过运行参数传入
  • 权限与初始化:入口脚本完成初始化后,切换到非特权用户运行服务

常用示例

常用示例
ENTRYPOINT ["/usr/local/bin/entrypoint.sh"]     # 固定入口脚本
CMD ["nginx", "-g", "daemon off;"]              # 默认参数,可被覆盖

# 入口脚本结尾把控制权交给实际服务,保证信号能传到
# exec "$@"

# 临时覆盖入口进容器排查
docker run --rm --entrypoint /bin/sh app/web:1.0

入口与默认命令的组合效果

运行命令实际执行说明
只给镜像名入口程序加默认参数镜像的默认行为
镜像名后跟参数入口程序加新参数默认参数被替换,入口不变
运行时覆盖入口新程序加原有默认参数原默认参数仍会作为参数传入
覆盖入口并给参数新程序加新参数两者都替换,调试常用
两者都未声明镜像基础层的行为容易出现容器启动即退出

写入口脚本的要点

  • 脚本最后用执行替换启动服务,避免脚本成为中间层挡住信号
  • 等待依赖要有超时与重试上限,别写成无限等待导致启动卡死
  • 初始化动作要幂等,容器重启后重复执行不会出问题
  • 需要降权的场景在脚本末尾切换身份,用专门的工具完成
  • 脚本出错要返回非零退出码,便于外部判断与自动重启策略生效
入口脚本里若不使用执行替换,服务进程会变成子进程,停止容器时信号到不了服务,总要等超时被强杀。
命令字符串形式的入口会忽略运行时追加的参数与默认命令,表现为参数完全传不进去,参数化部署基本靠数组形式实现。

易错点

  • 入口脚本没有用执行替换,服务收不到终止信号,停止容器总要等超时
  • 命令字符串形式声明的入口忽略了运行时参数,参数怎么传都不生效
  • 入口里无限等待依赖就绪,依赖异常时容器卡在启动过程,外部看不出问题
  • 入口脚本初始化动作不幂等,容器重启后重复执行造成数据重复或配置被覆盖

数据来源与参考

  • Docker 官方文档:Dockerfile ENTRYPOINT(docs.docker.com)
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌