Docker build构建镜像成功但docker images无镜像问题咨询
故障根本原因
- 你当前使用的
buildx v0.8.2-docker与Docker Engine 20.10.17的版本组合存在已知元数据同步缺陷:当使用绑定本地dockerd的默认builder驱动构建镜像时,buildx完成镜像层导出、写入本地overlay2存储后,未正确向dockerd发送镜像元数据更新事件,dockerd内存中维护的镜像列表缓存不会收录新构建的镜像条目。docker images命令默认读取该内存缓存,因此无法查询到新镜像。 - 构建日志末尾的
naming to **:**说明构建时传入的镜像标签参数(-t/--tag)存在解析异常:要么参数值为空、要么脚本变量替换失败、要么传入了不符合规范的tag格式,导致镜像构建完成后未被正确打标。旧版buildx对这类无合法tag的镜像不会主动触发dockerd镜像列表刷新,进一步提升了故障出现的概率。 - 注意:新镜像的所有层文件已经完整写入宿主机
/var/lib/docker目录,不存在构建失败、数据丢失的问题,仅为dockerd内存索引未更新导致的查询不到。
重启Docker方案的可行性评估
- 临时排障场景下该方法有效:重启dockerd服务时,进程会清空原有内存缓存,从磁盘元数据目录全量加载所有镜像记录,自然可以扫描到之前构建完成的镜像,操作本身不会损坏镜像数据。
- 生产环境不推荐使用该方案:重启Docker服务会中断节点上所有运行中的容器,业务影响范围大,属于治标不治本的临时处理手段。
推荐永久修复方案
- 升级buildx插件到v0.9.0及以上版本,该版本已修复默认builder驱动下本地镜像导出的元数据同步bug。
- 构建镜像时明确指定合法的镜像标签,禁止传入空tag值、避免依赖未定义的变量拼接tag,例如执行
docker build -t demo-app:v1 .,从根源避免日志中naming to **:**的异常。 - 暂时无法升级buildx的场景下,构建时可以指定输出类型强制走标准镜像加载流,执行命令为
docker buildx build --output type=docker,dest=- . | docker load,构建完成后无需重启dockerd即可在镜像列表中查询到结果。
内容的提问来源于stack exchange,提问作者xiaojueguan
相关产品推荐
相关产品推荐

