当前位置:首页 > 文章列表 > 文章 > 软件教程 > Docker Compose 怎么只重新构建一个服务及其依赖

Docker Compose 怎么只重新构建一个服务及其依赖

来源:17golang原创 2026-10-06 14:38:26 0浏览 收藏

只想重新构建 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 路径正确。若这里服务名或上下文就不对,后面加任何构建参数都不会得到预期范围。

Docker Compose 服务范围原创说明图,展示 worker、api 与 db 的依赖及构建状态
图1:目标服务、可构建依赖和仅镜像依赖的原创界面说明图,不是 Docker Desktop 或终端截图。

只构建目标服务和传递依赖

确认关系后,在 Compose 文件所在目录运行:

# 构建 worker,并递归构建它依赖且声明了 build 的服务
docker compose build --with-dependencies worker

官方命令格式允许在末尾传入一个或多个 SERVICE。不写服务名时,构建范围会扩大到项目中所有可构建服务;写了 worker 后,范围从该服务开始;再加 --with-dependencies,Compose 才把它的传递依赖纳入。以上面的配置为例,worker 和 api 会被构建,db 没有 build,不会出现本地镜像构建。

这个参数处理的是“目标依赖谁”,不是“谁依赖目标”。如果还有一个 dashboard 依赖 api,构建 worker 不会因为二者都用到 api 就顺带构建 dashboard。这正是它比无参数全量构建更可控的地方。

Docker Compose 定向构建原创结果说明图,展示 worker 和 api 已构建、无关服务未进入范围
图2:定向构建完成后的原创结果说明图,突出目标与依赖的构建范围,不是运行证据。

缓存、基础镜像和强制重建怎么选

多数日常改动应保留 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-cacheDockerfile 各层重新执行,耗时明显增加
检查基础镜像更新--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 前应先确认卷、健康检查和允许的中断窗口。

Docker Compose 容器重建范围原创说明图,对比只替换目标和连同依赖重建
图3:两种容器重建范围的原创界面说明图,帮助选择 --no-deps 或 --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

这套拆分的价值不在于命令更长,而在于把“构建哪些镜像”和“替换哪些容器”变成两个可独立判断的范围。项目越大,这种边界越能避免一次小改动触发无关服务重建。

版本声明
本文转载于:17golang原创 如有侵犯,请联系study_golang@163.com删除
Tokenizers offset mapping 怎么映射回原始文本位置Tokenizers offset mapping 怎么映射回原始文本位置
上一篇
Tokenizers offset mapping 怎么映射回原始文本位置
Go 模糊测试种子为什么没有覆盖到同一分支
下一篇
Go 模糊测试种子为什么没有覆盖到同一分支
查看更多
最新文章
查看更多
课程推荐
  • 前端进阶之JavaScript设计模式
    前端进阶之JavaScript设计模式
    设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。
    543次学习
  • GO语言核心编程课程
    GO语言核心编程课程
    本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。
    516次学习
  • 简单聊聊mysql8与网络通信
    简单聊聊mysql8与网络通信
    如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让
    500次学习
  • JavaScript正则表达式基础与实战
    JavaScript正则表达式基础与实战
    在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。
    487次学习
  • 从零制作响应式网站—Grid布局
    从零制作响应式网站—Grid布局
    本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。
    485次学习
查看更多
AI推荐
  • PubMedQA数据集详解:生物医学问答基准、功能与应用指南
    PubMedQA
    深入了解PubMedQA生物医学问答数据集,涵盖其核心功能、使用方法及在临床决策、药物研发等场景的应用,助力提升NLP模型性能。
    347次使用
  • H2O EvalGPT:开源LLM大模型评估与排行榜工具
    H2O EvalGPT
    H2O EvalGPT是H2O.ai推出的开源LLM评估平台,提供详细的大模型性能排行榜、行业特定基准测试及A/B测试功能,助您快速选择最适合项目的高性能大语言模型。
    409次使用
  • LMArena是什么?伯克利AI模型评估平台使用指南与功能解析
    LMArena
    LMArena是加州大学伯克利分校推出的AI模型匿名评测平台。通过盲测投票机制,用户可对比不同大模型回答并生成实时排行榜,助力开发者优化模型及用户选择最佳AI工具。
    411次使用
  • 斯坦福HELM:大语言模型Holistic Evaluation整体评估框架详解
    HELM
    深入了解斯坦福推出的HELM(Holistic Evaluation of Language Models)大模型评测体系。本文解析其核心功能、安装配置步骤及应用场景,涵盖准确性、公平性、鲁棒性等多维度指标,助力开发者全面优化语言模型性能。
    369次使用
  • MMBench详解:多模态大模型基准测试、功能特点与使用指南
    MMBench
    MMBench是由上海人工智能实验室等机构联合推出的多模态基准测试平台,提供细粒度能力评估、大规模数据集及VLMEvalKit工具。本文详细介绍其核心功能、安装使用方法及应用场景,助力开发者全面评估多模态模型性能。
    193次使用