首页/云/Docker 容器速查/docker compose run 一次性任务
Compose 编排55 条

docker compose run 一次性任务

为服务启动一次性容器跑指定命令(如数据库迁移、初始化脚本):默认不发布服务端口,可用 --rm 用完即删。

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

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,或改在编排文件里单独定义一个调试服务。

易错点

  • 忘记 --rm 会累积大量已退出的 run 容器与匿名卷,长期不清理会占用磁盘并让 ps -a 输出难以阅读
  • 把 run 当 restart 用会同时存在两份服务进程,若它们共用同一份数据卷可能互相覆盖写入
  • 在 CI 里不加 -T,任务可能在不可交互的环境中因分配伪终端失败
  • run 默认不启动依赖以外的服务,但依赖服务确实会被拉起,误以为它不影响线上运行中的服务

数据来源与参考

  • Docker 官方 CLI 参考:docker compose run(docs.docker.com)
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌