docker-compose run 默认自动清理容器,退出后立即删除,无需 --rm 参数;而 docker-compose up 默认保留已停止容器,需配合 down 才能批量清理。

在 Docker Compose 中,--rm 参数不能直接写在 docker-compose run 命令行里(如 docker-compose run --rm service cmd),但它的等效行为是默认开启的——只要不加 --no-rm,docker-compose run 启动的容器就一定会在退出后自动删除。这是它和 docker-compose up 的关键区别之一。
docker-compose run 默认就是 --rm 模式
docker-compose run 专为一次性任务设计,天然具备“干完就走”的特性:
- 它不会启动后台守护进程,而是前台运行、同步等待命令结束;
- 无论命令成功或失败(包括被 Ctrl+C 中断),容器都会立即退出并自动清理;
- 不占用服务名对应的网络别名(除非显式用
--service-ports或--publish); - 不会创建持久化容器,
docker ps -a中几乎看不到残留记录。
如何正确使用 docker-compose run 实现自动清理
只需一条命令,无需额外参数:
- 执行脚本校验:
docker-compose run app sh -c "npm ci && npm test" - 数据库迁移:
docker-compose run db psql -U postgres -d mydb -f /migrations/001.sql - 代码格式化(挂载当前目录):
docker-compose run --volume $(pwd):/src --workdir /src frontend npx prettier --write . - 带环境变量的一次性任务:
docker-compose run -e ENV=staging api python manage.py collectstatic --noinput
需要特别注意的几个细节
虽然自动清理是默认行为,但以下情况会影响结果:
- 如果服务定义中设置了
restart: always或restart: on-failure,run会忽略这些策略,不影响自动删除; - 挂载的匿名卷(
volumes: ["./data:/app/data"])不会被清理,宿主机文件和命名卷都保留; - 若想同时删掉临时命名卷,需手动加
--volume标志(Docker Compose v2.20+ 支持):docker-compose run --volume rm service cmd; - 误加
--no-rm会导致容器退出后保留在Exited状态,必须手动docker-compose rm清理。
对比 docker-compose up 和 run 的清理逻辑
很多人混淆两者的用途:
-
docker-compose up:用于长期服务,容器退出后默认仍保留(Exited状态),需配合docker-compose down才能批量清理; -
docker-compose run:就是为临时任务而生,不加任何选项即自动清理,加--no-rm反而是例外操作; - 实际开发中,把 CI 脚本、测试、迁移、构建等都交给
run,把 Web 服务、数据库等交给up,职责清晰,不留垃圾。











