如何让docker-compose优先使用本地Docker镜像而非远程镜像?
解决Docker Compose强制使用本地镜像的问题
我来帮你搞定这个问题!你遇到的情况其实挺常见——Docker Compose默认会校验镜像的远程状态,哪怕本地已经存在同名镜像,只要它觉得有更新的可能,就会尝试从Docker Hub拉取。下面是几个靠谱的解决办法,你可以根据自己的情况选择:
1. 确保本地镜像的标签和Compose配置完全匹配
Docker是通过「仓库名+标签」来识别镜像的,如果你用sbt Docker插件生成的镜像标签和compose里写的不一样,Compose自然会去远程找。
首先用docker images命令查看你本地的镜像信息,找到那个sbt生成的Spark镜像,记下它的REPOSITORY和TAG,或者直接用镜像ID。然后给它打上和compose里一致的标签:
# 把<本地镜像ID>换成你实际的镜像ID,<compose里的镜像名>换成gettyimages/spark:2.2.0-hadoop-xxx docker tag <本地镜像ID> <compose里的镜像名>
比如你的compose里写的是gettyimages/spark:2.2.0-hadoop-2.7,本地镜像ID是abc123,那命令就是:
docker tag abc123 gettyimages/spark:2.2.0-hadoop-2.7
2. 在Compose配置里添加拉取策略(推荐)
如果你的Docker Compose版本是v2.0及以上,可以直接在服务配置里加上pull_policy: never,强制Compose只使用本地镜像,本地没有就报错,绝对不会去远程拉取。
修改你的compose片段:
spark-master: image: gettyimages/spark:2.2.0-hadoop-2.7 pull_policy: never # 你的其他服务配置...
3. 启动时添加--no-pull参数(临时方案)
如果你用的是旧版本的Docker Compose(v1.x),不支持pull_policy,可以在启动命令里加上--no-pull参数,禁止拉取镜像:
docker-compose up -d --no-pull myimage
验证是否生效
执行启动命令后,看控制台输出,如果没有出现Pulling spark-master...的字样,就说明已经成功使用本地镜像了!
内容的提问来源于stack exchange,提问作者flybonzai
相关产品推荐
相关产品推荐

