Docker Compose 怎么只重新构建一个服务及其依赖
只想重新构建 Docker Compose 中的一个服务,同时把它依赖的可构建服务一并更新,最直接的命令是 docker compose build --with-dependencies 服务名。这里的关键是:build 负责生成镜像,up 才负责依据新镜像创建或重建容器,两者不要混成一个动作。
官方地址:https://docs.docker.com/reference/cli/docker/compose/build/
先用build --with-dependencies限定构建范围,再根据是否要动依赖容器选择up -d --no-deps或up -d --always-recreate-deps。这样既不会全量重建整个项目,也能明确控制容器变更范围。
先看清服务名、构建配置和依赖关系
--with-dependencies 读取的是 Compose 服务关系。它会把目标服务的依赖纳入构建范围,并递归处理传递依赖,但只有配置了 build 的服务才有“本地重新构建镜像”这件事。只写了 image: postgres:... 的数据库服务没有构建上下文,Compose 不会凭空为它执行 Dockerfile 构建。
假设项目中的 worker 依赖 api,而 api 又依赖仅使用现成镜像的 db:
services:
db:
image: postgres:17
# 只有 image,没有 build,因此不会被本地重新构建
api:
build:
context: ./api
depends_on:
- db
# api 有 build,可以作为 worker 的可构建依赖
worker:
build:
context: ./worker
depends_on:
- api
# 本次只指定 worker,避免构建无关服务
在执行构建前,先让 Compose 展开最终配置,尤其适合项目使用了多个 -f 文件、环境变量或 profile 的情况:
# 列出当前 Compose 配置里的真实服务名 docker compose config --services # 展开合并后的配置,核对 build 与 depends_on docker compose config
可见确认点是:输出中确实存在目标服务 worker,且 worker、api 的 build 路径正确。若这里服务名或上下文就不对,后面加任何构建参数都不会得到预期范围。

只构建目标服务和传递依赖
确认关系后,在 Compose 文件所在目录运行:
# 构建 worker,并递归构建它依赖且声明了 build 的服务 docker compose build --with-dependencies worker
官方命令格式允许在末尾传入一个或多个 SERVICE。不写服务名时,构建范围会扩大到项目中所有可构建服务;写了 worker 后,范围从该服务开始;再加 --with-dependencies,Compose 才把它的传递依赖纳入。以上面的配置为例,worker 和 api 会被构建,db 没有 build,不会出现本地镜像构建。
这个参数处理的是“目标依赖谁”,不是“谁依赖目标”。如果还有一个 dashboard 依赖 api,构建 worker 不会因为二者都用到 api 就顺带构建 dashboard。这正是它比无参数全量构建更可控的地方。

缓存、基础镜像和强制重建怎么选
多数日常改动应保留 BuildKit 缓存。它不会让“重新构建”失效,而是复用没有变化的层,只重做受影响部分。只有怀疑缓存掩盖了依赖变化,或明确需要从头执行 Dockerfile 时,才加入 --no-cache。
# 日常代码变更:保留缓存,速度最快 docker compose build --with-dependencies worker # Dockerfile 步骤必须全部重新执行:禁用构建缓存 docker compose build --no-cache --with-dependencies worker # 还要尝试拉取更新的基础镜像:在构建时加入 --pull docker compose build --pull --with-dependencies worker
| 需求 | 参数 | 影响 |
|---|---|---|
| 普通代码改动 | 不额外加参数 | 复用未变化的构建层 |
| 排除缓存干扰 | --no-cache | Dockerfile 各层重新执行,耗时明显增加 |
| 检查基础镜像更新 | --pull | 尝试拉取较新的基础镜像 |
不要把 --no-cache 当作每次部署的固定选项。它扩大的是目标和依赖内部的构建成本,并不会替你改变服务选择范围。
镜像构建好后,再决定重建哪些容器
docker compose build 完成后,正在运行的旧容器不会自动变成新镜像。下一步要根据实际影响范围选择 up 命令。
只替换目标服务容器
如果依赖服务的容器不需要重启,只想让 worker 使用新镜像:
# 只创建或重建 worker,不启动或重建它的依赖服务 docker compose up -d --no-deps worker
--no-deps 的含义是“不启动关联服务”。因此,即使前一步已经重新构建了 api 镜像,这条命令也只替换 worker 容器;正在运行的 api 容器仍可能继续使用旧镜像。这适合依赖镜像只是为下一次维护做准备,或者依赖当前不应中断的场景。
目标和依赖容器一起更新
如果依赖镜像也发生了变化,并且希望本次就让相关容器使用新镜像,可以明确要求 Compose 重建依赖:
# 重建 worker,并让依赖容器也按新镜像重新创建 docker compose up -d --always-recreate-deps worker
若目标容器的配置和镜像标识没有触发自动重建,但你仍要求强制替换目标,可以再加入 --force-recreate:
# 明确强制重建目标,同时重建依赖容器 docker compose up -d --force-recreate --always-recreate-deps worker
可见确认点是:命令输出或 Compose 状态中只出现 worker 及其依赖,没有无关服务被重建。对于数据库一类有状态服务,使用 --always-recreate-deps 前应先确认卷、健康检查和允许的中断窗口。

用状态和镜像列表做最后核对
完成构建和重建后,不需要全量翻日志。先看服务状态和镜像,再只检查目标服务的近期日志:
# 查看 Compose 服务状态和健康状态 docker compose ps # 查看各服务当前对应的镜像信息 docker compose images # 只读取目标服务最近的日志,避免被其他服务输出淹没 docker compose logs --tail=100 worker
验收时至少确认三件事:worker 处于运行或预期退出状态;镜像列表中目标与需要更新的依赖已对应新镜像;日志没有因为依赖未就绪、环境变量缺失或数据迁移失败而反复重启。如果使用了 --no-deps,还要明确接受依赖容器继续运行旧镜像这一结果。
常见误区
为什么只写 docker compose build worker 不够?
它只选择 worker 本身。要把 worker 的传递依赖也纳入构建,需要显式加入 --with-dependencies。
为什么依赖服务没有重新构建?
先检查依赖服务是否只有 image 而没有 build。镜像型服务可以被拉取、启动或重建容器,但没有本地 Dockerfile 构建上下文时,不属于 compose build 的可构建对象。
为什么镜像更新了,容器里还是旧代码?
通常是只执行了 build,没有执行对应的 up;或者使用 up --no-deps 后,只替换了目标容器,依赖容器仍在使用旧镜像。根据需要改用 --always-recreate-deps,并再次核对 docker compose images。
可以直接 docker compose up -d --build worker 吗?
可以用于简单场景,但它把构建与启动合在一次操作中,依赖重建范围不如两阶段写法直观。需要精确控制缓存、传递依赖和容器重建范围时,先 build --with-dependencies,再单独执行 up 更容易审查和回退。
命令速查
# 1. 核对服务名与最终配置 docker compose config --services docker compose config # 2. 只构建目标服务及其可构建传递依赖 docker compose build --with-dependencies worker # 3A. 只替换目标容器 docker compose up -d --no-deps worker # 3B. 目标和依赖容器一起重建 docker compose up -d --always-recreate-deps worker # 4. 查看最终状态 docker compose ps docker compose images
这套拆分的价值不在于命令更长,而在于把“构建哪些镜像”和“替换哪些容器”变成两个可独立判断的范围。项目越大,这种边界越能避免一次小改动触发无关服务重建。
Tokenizers offset mapping 怎么映射回原始文本位置
- 上一篇
- Tokenizers offset mapping 怎么映射回原始文本位置
- 下一篇
- Go 模糊测试种子为什么没有覆盖到同一分支
-
- 文章 · 软件教程 | 3小时前 | docker · provenance SBOM BuildKit Docker Buildx 镜像来源证明
- Docker Buildx 怎么给镜像同时生成 SBOM 和来源证明
- 335浏览 收藏
-
- 文章 · 软件教程 | 11小时前 | sync Docker Compose Compose Watch rebuild sync+restart
- Docker Compose Watch 的 rebuild 和 sync+restart 怎么选
- 244浏览 收藏
-
- 文章 · 软件教程 | 14小时前 | github · 故障排查 · CI/CD · gitHub actions · GitHub Actions 失败任务 Job workflow run 重跑任务
- GitHub Actions 怎么手动重跑单个失败任务
- 162浏览 收藏
-
- 文章 · 软件教程 | 22小时前 | 开发环境 · vs code · VS Code Docker Compose Dockerfile devcontainer.json Dev Containers
- VS Code Dev Containers 修改配置后怎么完整重建容器
- 368浏览 收藏
-
- 文章 · 软件教程 | 1天前 | vs code · 软件教程 · VS Code 设置同步 Profiles Settings Sync 扩展同步
- VS Code Profiles 怎么只同步指定扩展和设置
- 345浏览 收藏
-
- 文章 · 软件教程 | 1天前 |
- VS Code 提示仓库不安全时怎么处理 safe.directory
- 199浏览 收藏
-
- 文章 · 软件教程 | 1天前 | docker · Context ·
- Docker Context 怎么切换远程守护进程
- 372浏览 收藏
-
- 文章 · 软件教程 | 1天前 | 命令行 · 效率工具 · github · 开发工具 · 软件教程 · 位置参数 命令别名 GitHub CLI gh alias set shell alias
- GitHub CLI 怎么创建带参数的命令别名
- 404浏览 收藏
-
- 文章 · 软件教程 | 1天前 | obsidian · 软件教程 · YAML Properties Obsidian 笔记元数据 属性类型 Properties视图
- Obsidian Properties 怎么统一管理笔记元数据
- 378浏览 收藏
-
- 文章 · 软件教程 | 1天前 | postman · 软件教程 · 接口测试 · 环境变量 初始值 Postman 当前值 Local value Shared value
- Postman 环境变量怎么区分初始值与当前值
- 360浏览 收藏
-
- 前端进阶之JavaScript设计模式
- 设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。
- 543次学习
-
- GO语言核心编程课程
- 本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。
- 516次学习
-
- 简单聊聊mysql8与网络通信
- 如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让
- 500次学习
-
- JavaScript正则表达式基础与实战
- 在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。
- 487次学习
-
- 从零制作响应式网站—Grid布局
- 本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。
- 485次学习
-
- PubMedQA
- 深入了解PubMedQA生物医学问答数据集,涵盖其核心功能、使用方法及在临床决策、药物研发等场景的应用,助力提升NLP模型性能。
- 347次使用
-
- H2O EvalGPT
- H2O EvalGPT是H2O.ai推出的开源LLM评估平台,提供详细的大模型性能排行榜、行业特定基准测试及A/B测试功能,助您快速选择最适合项目的高性能大语言模型。
- 409次使用
-
- LMArena
- LMArena是加州大学伯克利分校推出的AI模型匿名评测平台。通过盲测投票机制,用户可对比不同大模型回答并生成实时排行榜,助力开发者优化模型及用户选择最佳AI工具。
- 411次使用
-
- HELM
- 深入了解斯坦福推出的HELM(Holistic Evaluation of Language Models)大模型评测体系。本文解析其核心功能、安装配置步骤及应用场景,涵盖准确性、公平性、鲁棒性等多维度指标,助力开发者全面优化语言模型性能。
- 369次使用
-
- MMBench
- MMBench是由上海人工智能实验室等机构联合推出的多模态基准测试平台,提供细粒度能力评估、大规模数据集及VLMEvalKit工具。本文详细介绍其核心功能、安装使用方法及应用场景,助力开发者全面评估多模态模型性能。
- 193次使用
-
- golang进程内存控制避免docker内oom
- 2022-12-22 160浏览
-
- golang进程在docker中OOM后hang住问题解析
- 2022-12-22 105浏览
-
- 多阶段构建优化Go 程序Docker镜像
- 2022-12-23 420浏览
-
- 构建Golang应用最小Docker镜像的实现
- 2023-01-07 276浏览
-
- golang实现对docker容器心跳监控功能
- 2022-12-24 175浏览
