首页/云/云与容器速查/docker compose exec 与 run 的区别
容器与 Docker106 条

docker compose exec 与 run 的区别

exec 进入已在运行的容器执行命令(改配置、连数据库客户端);run 则新建一次性容器跑任务(数据库迁移、批处理),必要时 --rm 用完即清。

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

exec 与 run 的区别

compose exec 在已经运行的容器里执行命令,改配置、连数据库客户端、看进程都靠它;compose run 则新建一个一次性容器跑任务,适合数据库迁移与批处理。一个作用在现有容器上,一个另起容器,混用会攒下一堆临时容器。

基本信息

execdocker compose exec db mysql -uroot -p,作用于运行中的容器
rundocker compose run --rm migrate,新建一次性容器
run 特性默认不发布端口、不覆盖重启策略、会先拉起依赖服务
清理run 创建的容器默认保留,任务类操作要加 --rm
选择调试进现有容器用 exec,一次性任务用 run
参数传递两者都可用双横线把参数传给容器内命令

exec 与 run 对比

维度execrun
作用对象已运行的容器新建的一次性容器
端口发布沿用现有映射默认不发布端口
依赖服务不处理会先拉起依赖服务
数据卷使用同一套卷同样使用同一套卷
典型用途调试、看进程、连客户端迁移、批处理、一次性脚本

使用示例

使用示例
docker compose exec web sh                                     # 进运行中的容器
docker compose exec db mysql -uroot -p"$MYSQL_ROOT_PASSWORD"    # 连数据库客户端
docker compose run --rm web npm run migrate                    # 一次性迁移任务
docker compose run --rm --no-deps web npm run seed             # 跳过依赖拉起

典型使用场景

  • 进入运行中的容器排查问题或临时改配置
  • 用数据库客户端连上容器里的数据库做查询
  • 执行数据库迁移与初始化脚本,跑完即清理
  • 跑一次性批处理任务,不污染常驻服务
run 创建的容器与常驻服务共享卷与网络:迁移脚本写错库名同样会毁数据,生产操作前先备份。
run 默认会把依赖服务一并拉起,只想跑单个服务时用 --no-deps,避免意外启动后端组件。
对已经停止的容器用 exec 会报服务未运行,需要先启动服务,或者改用 run 新建容器执行。
两种方式都会沿用服务的镜像与环境变量,区别只在生命周期:exec 依赖目标容器处于运行状态,run 随时可用但每次都新建并启动一套容器。

易错点

  • 对停止的容器用 exec:报服务未运行,需先启动或改用 run
  • 把 run 当 exec 用:每敲一次多一个容器,忘了 --rm 就攒一堆
  • run 时忘了它共享卷:误操作直接改到真实数据
  • 在 exec 里改配置文件却没落到卷:容器重建后改动全部丢失
  • 迁移任务用 run 却不加 --rm:临时的迁移容器长期留在列表里

数据来源与参考

  • Docker Docs:docker compose exec
  • Docker Docs:docker compose run

相关工具

​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌