怎么在 Docker Compose 中指定特定版本镜像避免自动更新

文章导读
想在 Docker Compose 里避免镜像自动更新,最稳妥的办法是在 docker-compose.yml 里把镜像标签从 latest 改成具体版本号,并且启动时不要用带拉取参数的命令。
📋 目录
  1. A 命令速用版
  2. B 为什么会这样
  3. C 分步处理
  4. D 怎么验证是否生效
  5. E 常见坑
  6. F 参考来源
A A

想在 Docker Compose 里避免镜像自动更新,最稳妥的办法是在 docker-compose.yml 里把镜像标签从 latest 改成具体版本号,并且启动时不要用带拉取参数的命令。

先说结论:固定镜像标签并避免使用强制拉取参数,能确保容器始终基于本地已有镜像运行。

  • 适合:生产环境或对稳定性要求较高的场景
  • 先准备:确认所需镜像的具体版本号并修改配置文件
  • 验收:启动后检查容器使用的镜像 ID 是否与预期一致

命令速用版

如果你希望直接使用本地已有镜像启动而不尝试联网更新,可以使用以下命令组合:

# 修改 docker-compose.yml 将 image: xxx:latest 改为 image: xxx:1.2.3
# 停止并移除容器(可选,视情况而定)
docker-compose down
# 仅启动容器,不拉取镜像
docker-compose start
# 或者重建容器但不拉取新镜像
docker-compose up -d

注意:确保本地已经存在对应版本的镜像,否则服务会启动失败。

为什么会这样

Docker Compose 的行为很大程度上取决于镜像标签(Tag)和启动参数。当你在配置文件中写 latest 标签时,Docker 会认为你需要最新的版本,在某些操作下会尝试联网拉取。而具体版本号(如 1.21.0)被视为固定依赖,本地存在时不会主动更新。

此外,docker-compose up 默认会在镜像缺失时拉取,但不会强制更新已存在的特定标签镜像,除非加上了 `--pull` always 参数。相比之下,docker-compose start 仅负责启动已存在的容器,完全不会触发镜像拉取逻辑,适合网络不稳定或需要严格锁定版本的场景。

分步处理

第一步:锁定镜像版本

怎么在 Docker Compose 中指定特定版本镜像避免自动更新

打开 docker-compose.yml,找到 image 字段,将 latest 替换为具体的版本号。例如:

services:
  web:
    image: nginx:1.21.0
    ports:
      - "80:80"

第二步:拉取指定版本(仅首次)

在确保网络正常时,手动拉取一次该版本,确保本地有货:

docker-compose pull

第三步:使用安全命令启动

后续日常启动或重启时,避免使用可能触发更新的参数。如果容器已存在,直接用:

docker-compose start

如果需要重建容器(例如修改了环境变量),使用:

docker-compose up -d

怎么在 Docker Compose 中指定特定版本镜像避免自动更新

不要添加 `--pull` 相关标志。

怎么验证是否生效

启动后,通过以下命令检查容器实际使用的镜像 ID,确认它没有变成新版本:

docker inspect <容器名> | grep ImageID

或者查看本地镜像列表,确认该标签对应的镜像 ID 没有变化:

docker images | grep nginx

如果多次启动后镜像 ID 保持一致,说明没有发生自动更新。

常见坑

  • 慎用 latest 标签:这是导致意外更新的最常见原因,生产环境建议永远绑定具体版本号。
  • 避免 `--pull` always:在 CI/CD 脚本或启动命令中,检查是否误加了强制拉取参数,这会导致每次启动都尝试联网更新。
  • 区分 restart 和 up:docker-compose restart 只是重启容器,不会替换镜像;但 up 可能会因配置哈希变化重建容器,需确保本地镜像版本正确。
  • 网络故障风险:如果配置了 latest 且网络不佳,启动时可能因拉取超时而失败,锁定版本可避免此问题。

参考来源

  • docker-compose 怎么不更新镜像直接启动
  • 容器重建却不更新镜像?Docker Compose 镜像更新机制深度解密
  • 如何在 Docker Compose 中获取最新镜像,这些方法要会!
  • 使用 Docker Compose 升级镜像的正确姿势
  • docker compose 如何每次启动都是最新的