github编辑

ENTRYPOINT 入口点

什么是 ENTRYPOINT

ENTRYPOINT 指定容器启动时运行的入口程序。与 CMD 不同,ENTRYPOINT 定义的命令不会被 docker run 的参数覆盖,而是接收这些参数

核心作用:让镜像像一个可执行程序一样使用,docker run 的参数作为这个程序的参数。


语法格式

格式
语法
推荐程度

exec 格式

ENTRYPOINT ["可执行文件", "参数1"]

推荐

shell 格式

ENTRYPOINT 命令 参数

⚠️ 不推荐

# exec 格式(推荐)
ENTRYPOINT ["nginx", "-g", "daemon off;"]

# shell 格式(不推荐)
ENTRYPOINT nginx -g "daemon off;"

ENTRYPOINT vs CMD

核心区别

特性
ENTRYPOINT
CMD

定位

固定的入口程序

默认参数

docker run 参数

追加为参数

完全覆盖

覆盖方式

--entrypoint

直接指定命令

适用场景

把镜像当命令用

提供默认行为

行为对比


场景一:让镜像像命令一样使用

需求

创建一个查询公网 IP 的"命令"镜像。

使用 CMD 的问题

使用 ENTRYPOINT 解决

交互图示


场景二:启动前的准备工作

需求

在启动主服务前执行初始化脚本(如数据库迁移、权限设置)。

实现方式

docker-entrypoint.sh

工作流程

关键点

  1. exec "$@":用传入的参数替换当前进程,确保信号正确传递

  2. 条件判断:根据 CMD 不同执行不同逻辑

  3. 用户切换:使用 gosu 切换用户(比 su 更适合容器)


场景三:带参数的应用


覆盖 ENTRYPOINT

使用 --entrypoint 参数覆盖:


ENTRYPOINT 与 CMD 组合表

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!


最佳实践

1. 使用 exec 格式

2. 提供有意义的默认参数

3. 入口脚本使用 exec

4. 处理信号

确保 ENTRYPOINT 脚本能正确传递信号:


本章小结

ENTRYPOINT
CMD
适用场景

镜像作为固定命令使用

简单的默认命令

推荐:固定命令 + 可配置参数

延伸阅读

最后更新于