Docker Compose dry-run 怎样预览服务启动会执行哪些操作
来源:17golang原创
时间:2026-10-26 02:19:11 305浏览 收藏
如果你想先知道 Docker Compose 启动项目会拉取什么、构建什么、创建哪些容器,可以把原命令前面加上 --dry-run。例如,docker compose --dry-run up --build -d 会输出一次预览计划,展示 pull、build、创建网络、创建容器、等待健康检查和启动等动作,但不会真的改变 Compose 栈状态。
官方地址:https://docs.docker.com/reference/cli/docker/compose/
--dry-run应该放在docker compose后面,后面的up、--build、-d和服务名保持真实执行时的写法。- 输出里的
DRY-RUN MODE表示动作被模拟,不能把它当成容器已经创建或启动。 ps、ls、logs本身是查询命令,不适合用 dry-run;需要查看它们时直接运行对应查询命令。
一、先判断命令是否值得预览
dry-run 的目标是提前查看会改变 Compose 栈的动作。最适合预览的是 up、pull、build、create 等命令,因为它们可能拉取镜像、构建镜像或创建容器。把这些动作提前展开,能在执行前发现服务范围过大、构建步骤不符合预期或依赖服务会被一并拉起等问题。
相反,ps、ls 和 logs 用来读取已经存在的项目、容器或日志状态,它们不负责改变栈状态。Docker 官方文档明确说明 dry-run 不能用于这类查询命令,所以不要为了统一格式给所有 Compose 命令都加上这个参数。

二、把真实启动参数原样放进预览命令
在 compose.yaml 所在目录执行命令。需要构建镜像时保留 --build,需要后台启动时保留 -d;如果只想预览某一个服务,也可以在命令末尾写服务名。这样得到的计划才和后面真正执行的动作一致。
# 进入包含 compose.yaml 的项目目录,避免读到其他项目的配置 cd ./compose-demo # 只预览拉取、构建、创建和启动计划,不改变当前栈状态 docker compose --dry-run up --build -d # 只预览 web 服务及其启动动作,保留真实执行时的服务范围 docker compose --dry-run up --build -d web
如果项目使用了多个 Compose 文件,继续按真实启动时的顺序传入 -f;如果需要指定环境文件,也把 --env-file 一起保留。预览命令不是新的配置解析器,它仍然读取你给出的项目文件和参数。
# 先指定基础文件,再指定覆盖文件;顺序会影响最终配置 docker compose --dry-run \ -f compose.yaml \ -f compose.dev.yaml \ --env-file .env.dev \ up --build -d
三、按输出顺序读懂动作计划
预览输出通常会用 DRY-RUN MODE 标记每个动作。阅读时不要只看最后一行,而要从资源准备到服务启动按顺序看一遍。一个包含数据库、后端和代理的项目,常见顺序是先拉取镜像,再构建需要本地 Dockerfile 的服务,然后创建网络与容器,等待数据库健康,最后启动依赖它的服务。

# 预览完整启动计划,输出中的每一项都只表示计划动作 docker compose --dry-run up --build -d # 需要更容易复制到日志系统时,关闭彩色控制字符 docker compose --ansi never --dry-run up --build -d
看到 healthy 后才出现依赖服务的 start,通常说明 Compose 正在遵守健康检查条件;看到 Created 或 Started 时仍要记住这是模拟输出。dry-run 的价值是告诉你将会发生什么,不是替你完成资源创建。
四、用预览结果决定是否真的执行
可以把预览结果按三层快速核对:第一层看服务范围,确认没有误把数据库、代理或测试服务一起纳入;第二层看资源动作,确认 pull、build、create 是否符合当前环境;第三层看依赖关系,确认等待健康检查的服务不会因为启动顺序不对而失败。
# 预览通过后,去掉 --dry-run 才会真正创建或启动资源 docker compose up --build -d # 如果只是想查看当前容器,不要使用 dry-run,直接查询状态 docker compose ps # 如果只是想看服务日志,也直接读取日志输出 docker compose logs --tail=100 web
预览和执行之间如果修改了 Compose 文件、环境变量或镜像构建内容,应重新做一次 dry-run。否则你确认的是旧计划,真正执行的却是另一份配置。
常见误区
| 现象 | 原因 | 处理方式 |
|---|---|---|
| 输出里出现了 Created,但本机没有新容器 | 这是 dry-run 的模拟结果 | 去掉 --dry-run 后再执行真实命令 |
给 logs 加 dry-run 报错 | 日志查询不改变栈状态 | 直接运行 docker compose logs |
| 预览的服务比预期多 | 真实命令包含了全部服务或依赖服务 | 检查命令末尾的服务名、依赖关系和 Compose 文件参数 |
| 预览顺序和执行结果不一致 | 预览后又改了配置或环境变量 | 用最终配置重新执行一次 dry-run |
相关问题
dry-run 会拉取镜像或创建容器吗?
不会。它展示 Compose 计划执行的动作,但不会把这些状态变更真正应用到栈上。
可以只预览一个服务吗?
可以。在 up 后面写服务名,例如 docker compose --dry-run up -d web,但仍要留意该服务的依赖可能进入计划。
dry-run 和 docker compose config 有什么区别?
config 用来解析、合并并渲染 Compose 配置;dry-run 用来预览会改变栈状态的命令。前者回答“最终配置是什么”,后者回答“执行命令将做什么”。
-
160 收藏
-
105 收藏
-
420 收藏
-
276 收藏
-
175 收藏
-
480 收藏
-
188 收藏
-
284 收藏
-
287 收藏
-
422 收藏
-
482 收藏
-
353 收藏
-
150 收藏
-
460 收藏
-
161 收藏
-
270 收藏
-
465 收藏
-
- 前端进阶之JavaScript设计模式
- 设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。
- 立即学习 543次学习
-
- GO语言核心编程课程
- 本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。
- 立即学习 516次学习
-
- 简单聊聊mysql8与网络通信
- 如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让
- 立即学习 500次学习
-
- JavaScript正则表达式基础与实战
- 在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。
- 立即学习 487次学习
-
- 从零制作响应式网站—Grid布局
- 本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。
- 立即学习 485次学习