Docker Compose提示镜像清单不存在但标签实际存在的问题排查
问题根源解析
其实这个报错的核心原因很明确:你混淆了Docker本地镜像仓库和远程Registry的存储逻辑,同时没注意docker-compose pull的行为规则。
当你的docker-compose-testing.yml里指定镜像地址为MY_SERVER_IP:5000/lens/translator:${VERSION}时,执行docker-compose pull命令时,Docker会默认去这个地址对应的远程Registry(也就是你服务器上监听5000端口的那个)拉取镜像,而不是直接使用你通过docker load导入到服务器本地的镜像。
你通过docker save+scp+docker load操作,只是把镜像加载到了服务器的本地Docker镜像仓库里,这些镜像并没有被推送到5000端口的远程Registry中。所以当pull命令去Registry查找578d8de标签的translator镜像时,自然找不到对应的manifest文件,就抛出了这个错误。
两种可行的解决方案
根据你的实际需求,你可以选择下面任意一种方式解决:
方案一:跳过Pull步骤,直接使用本地镜像
既然你已经确认服务器本地已经有了所有需要的镜像,完全可以去掉命令里的pull环节,直接启动容器:
export VERSION=578d8de && envsubst < docker-compose-testing.yml | docker-compose -f - -p PROJECT_NAME up -d --no-build --scale worker=5
Docker在启动容器时,会优先检查本地是否存在指定的镜像,如果存在就直接使用,不会再去远程Registry拉取。
方案二:将本地镜像推送到服务器的Registry中
如果你需要保留pull步骤(比如后续有其他机器需要从这个Registry拉取镜像的场景),可以把本地加载的镜像推送到5000端口的Registry:
- 先确认本地镜像的tag是否正确指向Registry地址(如果之前的tag已经是
MY_SERVER_IP:5000/lens/translator:578d8de可以跳过这步):
(上面的docker tag e9eb25fa0aef MY_SERVER_IP:5000/lens/translator:578d8dee9eb25fa0aef是你translator镜像的ID,从docker images的输出里就能拿到) - 执行推送命令:
按照同样的步骤,把auth、nginx_testing等其他需要的镜像也推送到Registry,之后再执行你原来的docker push MY_SERVER_IP:5000/lens/translator:578d8depull+up命令就不会报错了。
额外提醒
一定要记住:
docker load/docker build是把镜像存入本地Docker镜像仓库,只有当前服务器的Docker进程可以直接访问;docker push是把本地镜像上传到远程Registry,所有能访问这个Registry地址的Docker环境都可以拉取使用。
内容的提问来源于stack exchange,提问作者Gean Ribeiro
相关产品推荐
相关产品推荐

