You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Docker Buildx构建镜像时出现旧镜像内容异常问题求助

Docker Buildx 构建镜像异常问题解答

问题描述

使用Docker版本24.0.7-ce(build 311b9ff0aa93),基于opensuse/leap编写Dockerfile,通过docker buildx build -t my-base .构建镜像后,直接运行docker run -it --rm my-base,文件系统符合预期。但执行以下命令构建my-test镜像并运行时,容器内容却是几天前的旧版本:

docker buildx build --no-cache -t my-test - <<EOF
FROM my-base
EOF
docker run -it --rm my-test

已尝试docker buildx prune -a清理缓存、在FROM行显式指定:latest标签,均无效;本地镜像无摘要无法指定,且无同名仓库镜像,甚至删除相关镜像后重新构建问题依旧。尝试使用镜像ID作为FROM源时,出现错误:

ERROR: failed to solve: fc27666e10d4: pull access denied, repository does not exist or may require authorization: server message: insufficient_scope: authorization failed

对比两个镜像的层发现,my-test与my-base仅第一层相同,其余层几乎完全无关。

问题原因与解决方法

1. Buildx构建器驱动隔离导致本地镜像未被识别

Docker Buildx默认可能启用docker-container驱动,该驱动会在独立的容器环境中执行构建,这个环境和本地Docker引擎的镜像仓库完全隔离。你本地构建的my-base镜像无法被这个隔离环境读取,它会优先尝试从远程仓库拉取同名旧镜像(如果之前推送过),或者使用构建器自身缓存的旧层,最终导致my-test是旧版本。

而用镜像ID作为FROM源时,隔离环境无法直接访问本地主机的镜像ID,会默认尝试从远程仓库拉取该ID对应的镜像,自然触发权限不足的错误。

2. 构建产物未同步到本地Docker仓库

使用docker-container驱动时,Buildx构建完成的镜像默认不会自动加载到本地Docker镜像仓库。你执行docker run my-test时,实际运行的是本地残留的旧镜像,而非刚构建的新版本。

解决步骤

  • 检查当前Buildx构建器:执行docker buildx ls查看正在使用的构建器驱动,若显示docker-container,则确认是隔离环境导致的问题。
  • 切换到本地Docker驱动的构建器:创建并启用基于本地Docker引擎的构建器:
    docker buildx create --use --driver docker
    
  • 构建时强制同步镜像到本地:若需继续使用docker-container驱动,构建时添加--load参数,让Buildx将产物同步到本地Docker仓库:
    docker buildx build --no-cache --load -t my-test - <<EOF
    FROM my-base
    EOF
    
  • 验证结果:重新构建后运行容器,确认内容是否符合预期。

内容的提问来源于stack exchange,提问作者Miral

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.14 04:25:04