背景

在对 Rocket.Chat 从 7.9 升级至 7.10.x 的过程中,修改了 docker-compose.yml 中 Rocket.Chat 镜像版本号,随后执行:

docker compose pull

结果出现拉取失败,错误信息指向 MongoDB 镜像,而非 Rocket.Chat 本身。


错误现象

执行 docker compose pull 时出现如下关键报错:

Error manifest for bitnami/mongodb:7.0.15 not found
manifest unknown: manifest unknown

同时,Rocket.Chat 镜像拉取被中断:

Image registry.rocket.chat/rocketchat/rocket.chat:7.10.2 Interrupted

初步排查结论

  • docker-compose.yml仅修改了 Rocket.Chat 镜像版本
  • MongoDB 服务配置未发生任何变更
  • Rocket.Chat 从 7.9 → 7.10.0 的升级过程此前是成功的

因此问题并非配置写错或版本不兼容


根本原因分析

问题的根源在于 Bitnami MongoDB 镜像的 tag 已在远端 registry 中不存在

bitnami/mongodb:7.0.15

Docker 在执行 docker compose pull 时,会对 compose 文件中所有服务镜像执行拉取操作:

  • 即使本地已有镜像
  • 即使当前并不打算升级 MongoDB

一旦 registry 中不存在该 tag,就会直接报错并中断整个 pull 流程。

为什么之前升级没有问题?

原因通常是以下之一(或组合):

  1. 本地已经缓存了 bitnami/mongodb:7.0.15 镜像
  2. 之前执行的是 docker compose up -d,而不是 pull
  3. MongoDB 容器未被重建,因此未触发拉取

因此,“之前能升级成功”和“现在 pull 失败”是可以同时成立的


为什么 docker compose up -d 可以正常执行?

docker compose up -d 的行为是:

  • 优先使用本地已有镜像
  • 只有在镜像不存在时才尝试拉取

因此在本地已有 MongoDB 镜像的情况下:

docker compose up -d

可以正常启动或重建容器,而不会触发远端 tag 不存在的问题。


解决方案

方案一(临时恢复运行)

直接使用:

docker compose up -d

前提条件:

  • 本地仍存在可用的 MongoDB 镜像
  • MongoDB 数据卷未损坏

该方案可以快速恢复服务,但不适合作为长期解决方案


方案二(推荐,长期稳定)

修改 docker-compose.yml 中 MongoDB 镜像版本,避免使用可能被下架的精确小版本 tag。

不推荐(存在风险)

image: bitnami/mongodb:7.0.15

推荐写法一:锁主版本

image: bitnami/mongodb:7.0

优点:

  • 仍限制在 7.0 主版本
  • 避免具体 patch 版本被移除

推荐写法二:锁定完整构建版本(最可复现)

image: bitnami/mongodb:7.0.14-debian-12-rX

(以实际存在的 tag 为准)


方案三(绕过失败镜像)

如果需要临时拉取其他镜像,可使用:

docker compose pull --ignore-pull-failures

该方式不会因为单个镜像失败而中断整个拉取流程,但不解决根本问题


经验总结

  1. Docker 镜像 tag 并非永久存在
    • 尤其是第三方发行版(如 Bitnami)
  2. docker compose pull 会严格校验所有服务镜像
  3. docker compose up -d 更适合已有镜像的增量升级
  4. 数据库类服务应避免使用过于精确、不可控的 tag
  5. 生产环境建议锁定:
    • 主版本,或
    • 完整构建版本 / digest

最终状态

  • 使用 docker compose up -d 成功启动服务
  • 问题确认为 远端镜像 tag 消失
  • 服务本身与数据未受影响

Leave a Reply

Your email address will not be published. Required fields are marked *