compose run 是什么
docker compose run 会按 compose 文件里某个服务的定义,额外启动一个一次性容器来执行指定命令,常用于数据库迁移、数据初始化、脚本化运维和一键进容器调试。它与 exec 的关键差别是:exec 进入已经在运行的那个容器,run 则新建一个容器。新建意味着它会重新解析卷、环境变量与依赖服务,但默认不会发布端口,也不会顶替 up 起着的那个容器。
基本信息
| 语法 | docker compose run [选项] 服务 [命令] [参数...] |
|---|---|
| 默认行为 | 先启动依赖服务;不发布端口;分配伪终端 |
| 容器命名 | 项目名_服务名_run_序号 或末尾带哈希 |
| 常用选项 | --rm 用完删除、--no-deps 跳过依赖、--service-ports 发布端口、-T 禁用伪终端、-e/-v 追加变量与挂载、--entrypoint 覆盖入口 |
| 与 up 关系 | run 创建的容器不受 up/down 统一管理 |
| 适用版本 | Compose v2 插件(docker compose),也兼容老版 docker-compose run |
典型使用场景
- 执行一次性数据库迁移,跑完容器即弃
- 初始化数据:建库、导入种子数据、预热缓存
- 以服务同样的环境变量与依赖连通性跑一段临时脚本
- 进入与线上一致的环境排查问题,含依赖服务已就绪的条件
- 批量执行运维任务,例如清理过期数据、重建搜索索引
- CI 中在服务定义好的前提下跑测试用例,复用同一份编排文件
常用写法
常用写法
# 迁移:跑完即删,--no-deps 避免把依赖库一并重启
docker compose run --rm --no-deps web python manage.py migrate
# 需要按 compose 文件对外暴露端口时必须显式声明
docker compose run --rm --service-ports web sh
# 临时追加变量与挂载,覆盖本次运行
docker compose run --rm -e DEBUG=1 -v $PWD/data:/data web python job.py
# 覆盖入口与禁用终端:脚本/CI 环境用 -T 更稳
docker compose run --rm -T --entrypoint sh web -c 'ls /app'
# 清点遗留的一次性容器
docker compose ps -a选项怎么选
| 选项 | 作用 | 适用时机 |
|---|---|---|
| --rm | 退出后自动删除容器 | 几乎所有一次性任务都该加 |
| --no-deps | 不启动依赖服务 | 依赖已在运行时 |
| --service-ports | 按编排文件发布端口 | 需要从宿主访问该服务 |
| -T | 不分配伪终端 | CI、定时任务等无终端环境 |
| -e KEY=VALUE | 本次运行追加环境变量 | 临时调试开关 |
| --entrypoint | 覆盖镜像入口 | 进容器手动排查 |
run 的容器不会在下次 up 时被更新或复用:改了 compose 文件,重新 run 一次新容器即可,不必先 down。反过来,run 出来的容器不属于 up 的管理范围,up 之后它仍在,需要手动清理。
默认不发布端口是为了避免与 up 起的同名服务抢占宿主端口;确实需要外部访问时用 --service-ports,或改在编排文件里单独定义一个调试服务。