DEBUG.WIKI
V.PS:让项目靠近用户,亚太、欧洲、北美 KVM VPS
IPPeak:从目标地区访问网页,住宅代理、SEO 监测、广告验证
ZgoCloud:多地区部署,按需选节点;日本、美国、香港、德国

Compose 添加 build 后仍拉取镜像:检查 pull_policy

开发覆盖文件增加 build 后仍使用仓库镜像,先看合并模型中的 image 和 pull_policy。明确本地构建策略,再核对实际运行产物。

基础 Compose 文件写了 image,开发覆盖文件增加了 build。本地 Dockerfile 明明已经修改,docker compose up -d 却仍拉取并启动仓库中的镜像。先查看合并结果里的 pull_policy:增加 build 不会自动删除基础文件的 image 和拉取策略。

这种配置曾出现在 Compose 2.6.1、Docker Engine 20.10.17 环境中。处理时应以当前工具实际生成的模型和现行策略为准,不把旧版本的讨论直接当成所有版本的行为承诺。

覆盖文件可能只增加了构建来源

下面用独立的开发标签说明合并关系,仓库地址和路径均为示例:

# compose.yaml
services:
  app:
    image: registry.example.com/team/app:dev-check
    pull_policy: always
# compose.dev.yaml
services:
  app:
    build:
      context: .
      dockerfile: docker/Dockerfile

合并后,app 同时具有 image、build 和 pull_policy: always。image 仍指定镜像名称,build 增加了本地构建配置,两者是不同属性。always 要求从仓库拉取,不能因为后一个文件包含 Dockerfile 路径,就认为仓库镜像已被排除。

用启动时同一组文件和项目参数检查:

docker compose -p app-dev -f compose.yaml -f compose.dev.yaml config

实际项目名和文件顺序需要保持一致;若脚本使用了更多覆盖文件,也要一并带上。输出可能展开密码或连接串,分享前脱敏。重点确认 image、构建上下文、Dockerfile 路径和 pull_policy,不要仅检查刚编辑的文件。

本地开发要明确选择构建策略

如果这个环境就是要使用本地 Dockerfile,可以在开发覆盖层显式设置:

services:
  app:
    build:
      context: .
      dockerfile: docker/Dockerfile
    pull_policy: build

当前 Compose 的 build 策略要求构建镜像,已有镜像也会重新构建;这不等于每一层都不使用缓存。保留 image 时,构建结果仍使用该镜像名称,因此示例采用开发检查标签,避免覆盖生产使用的标签。

若没有设置 pull_policy,同时存在 image 和 build 时,当前规则会先尝试拉取镜像,镜像在仓库或相应平台缓存中不可用时再构建。删掉 always 并不自动等于“以后每次优先本地构建”。never 也只是避免拉取、依赖已有镜像,不能代替明确的构建策略。

部署环境如果要求始终使用已审核的仓库产物,就应保留其拉取策略;不要为了让一次本地修改出现,顺带改变生产镜像来源。

核对运行的镜像,而不只看构建结束

在修改前保存完整配置和当前镜像摘要。应用开发配置会构建镜像,并可能重建服务、打断连接,应选择合适的环境和时间。重新运行同参数的 config,确认策略已变成 build;随后检查构建日志是否使用预期上下文与 Dockerfile,以及启动后的容器是否引用此次构建结果。

如果确实构建了新镜像,容器却仍表现为旧文件,继续检查挂载是否覆盖镜像内容。若旧内容来自数据卷,可转到命名卷遮住更新后的文件,不要直接删卷验证。

回退时恢复原文件与镜像来源,按原部署参数应用;需要恢复旧运行版本时使用先前保存的镜像摘要。清空全部构建缓存、删除数据卷都不属于这个拉取策略问题的必要操作。