两个字段在做什么
command 与 entrypoint 是 Compose 里「运行时覆盖镜像启动指令」的一对字段:command 覆盖镜像的 CMD,entrypoint 覆盖镜像的 ENTRYPOINT。Docker 镜像把 ENTRYPOINT 当固定入口、CMD 当默认参数,Compose 只是把这套组合搬到编排文件里,让同一镜像在常驻服务、一次性任务、排障容器之间切换而不必重建镜像。
基本信息
| 适用平台 | Docker Compose v2(docker compose 子命令 / Compose Spec) |
|---|---|
| command | 覆盖镜像的 CMD(默认参数) |
| entrypoint | 覆盖镜像的 ENTRYPOINT(固定入口) |
| 清空入口点 | entrypoint: [] 后由 command 直接作为主命令执行 |
| 生效时机 | 容器创建时写入,改动后需重建容器 |
典型使用场景
- 同一镜像跑多角色:常驻服务用镜像默认入口,定时任务用 command 跑一次性脚本
- 排障保活:把 entrypoint 临时改成 shell 并 sleep 保活,进容器逐条验证命令
- 初始化任务:清空 entrypoint 后直接执行 /app/init-db 之类的迁移脚本
- 参数微调:只覆盖 command 换掉默认参数,保留镜像原有 ENTRYPOINT
- CI 复用镜像:同一镜像分别执行测试命令与生产启动命令,减少镜像数量
覆盖写法示例
覆盖写法示例
services:
api: # 常驻服务:保留镜像入口,只换运行参数
image: app/api:1.4.2
command: ['--config', '/etc/app/prod.yaml']
debug: # 排障容器:改入口为 shell 并保活
image: app/api:1.4.2
entrypoint: ['/bin/sh', '-c']
command: ['sleep infinity']
once: # 一次性任务:清空入口点后直接执行脚本
image: app/api:1.4.2
entrypoint: []
command: ['/app/init-db']
# 应用改动:docker compose up -d --force-recreate once写法与行为对照
| 写法 | 作用 | 注意点 |
|---|---|---|
| command: ['a','b'] | 覆盖镜像 CMD | 列表形式不经 shell,参数原样传递 |
| entrypoint: ['/bin/sh','-c'] | 覆盖镜像 ENTRYPOINT | 需要管道与变量替换时用这种方式包一层 |
| entrypoint: [] | 清空 ENTRYPOINT | 让 command 直接成为主进程命令 |
| command: 'echo hi' | 字符串形式 | 按空格切分,语义与列表不同,迁移优先用列表 |
这类字段只在创建容器时写入,docker compose restart 不会重新读取编排文件里的改动,要执行 docker compose up -d(必要时加 --force-recreate)触发重建。
entrypoint 写成 shell 形式时,shell 会成为容器 PID 1,docker stop 发的信号不一定传到真正的应用进程;常驻服务尽量用 exec 列表形式。