当前位置: 首页 > news >正文

跨架构镜像打包问题及解决方案

问题背景:

  • 需求:
    • 有一个镜像是 docker.io 的,是 docker.io/aquasec/kube-bench:v0.10.6,我想把该镜像在本地电脑(可翻墙)下载下来,然后 docker save 打包成一个 tar 包,传输到服务器上。
  • 环境:
    • 本地电脑:MacOS 14.5 (ARM64)
    • Docker Desktop:4.41.2 (191736)
    • Docker Engine:28.1.1

问题现象

我的电脑是 arm64 架构,我考虑通过 docker pull --platform=linux/amd64 下来镜像,然后 docker save 成一个 tar 包,传输到服务器上,直接 docker load 使用,具体命令如下:

# 拉取 linux/amd64 架构镜像
docker pull --platform=linux/amd64 docker.io/aquasec/kube-bench:v0.10.6# 打包镜像为tar包
docker save -o kube-bench.tar docker.io/aquasec/kube-bench:v0.10.6

但是在执行 docker save 命令时,报错信息:
Error response from daemon: unable to create manifests file: NotFound: content digest sha256:b544d2a5cba58aa28c123fe2a535893f607d4f6b62a38db370c4dcc3a6a275e6: not found

根因分析:

详细原因参考:https://github.com/docker/cli/issues/5476

  1. Docker Desktop Bug:当宿主机与目标镜像架构不同时,docker save 错误地尝试访问宿主机架构(ARM64)的manifest数据。
  2. 预期行为:save 操作应仅打包已拉取的指定架构(AMD64)镜像数据,不应检查其他架构
  3. 补充验证:相同操作在Ubuntu AMD64主机上保存ARM64镜像可成功(反向场景正常)

补充:该问题属于是 docker desktop 的一个bug了,同样的操作,我在 ubuntu amd64 服务上,使用 docker save 一个 arm64 架构的镜像,可以正常 docker save 成功。

save 失败是因为 docker 在 save 时去找了 arm64 架构镜像的元数据(b544d2a5cba58aa28c123fe2a535893f607d4f6b62a38db370c4dcc3a6a275e6 就是 arm64 架构镜像的sha256),发现没找到,就报错了,正常情况不应该报错,因为 save 操作其实就是将镜像元数据和 layer 层打包就可以了。

解决方案:

docker save 时显式指定平台参数:

# 打包指定架构镜像为tar包
docker save -o kube-bench.tar --platform=linux/amd64 docker.io/aquasec/kube-bench:v0.10.6

可以正常 save 成功。

建议

  1. 完整性验证:传输后可在服务器执行 docker load -i kube-bench.tar && docker inspect --format=‘{{.Architecture}}’ <IMAGE_ID> 确认架构
  2. 替代方案:考虑使用 skopeo 工具(更适合跨架构镜像操作)
  3. 长期方案:关注Docker Desktop更新,该问题可能在未来版本修复
http://www.xdnf.cn/news/713791.html

相关文章:

  • 棋盘问题(放置棋子)
  • ranges属性验证
  • 逻辑回归详解:从原理到实践
  • notion搭建个人知识管理库
  • 利用Python制作环保志愿者招募海报
  • 设计师如何搭建自己的素材库?
  • useRef、useForwardRef 和 useImperativeHandle
  • SpringSecurity
  • 深入了解 C# 异步编程库 AsyncEx
  • Minimax-speech-hd
  • Qt DateTimeEdit(时间⽇期的微调框)
  • 【QQ音乐】sign签名| data参数加密 | AES-GCM加密 | webpack实战 (下)
  • ElasticSearch简介及常用操作指南
  • TypeScript中?和!号用法
  • Asp.Net Core 托管服务
  • Cannot find any provider supporting AES/ECB/PKCS7Padding
  • 智能外呼系统中 NLP 意图理解的工作原理与技术实现
  • 【前端】Vue3 中实现两个组件的动态切换保活
  • 制造企业生产数据分析全解析:5大类数据定义、分析方法与落地指南
  • 【Oracle】DCL语言
  • 【深度学习新浪潮】什么是混合精度分解?
  • Docker常用命令操作指南(一)
  • OPC Client第6讲(wxwidgets):Logger.h日志记录文件(单例模式);登录后的主界面
  • 【HTML/CSS面经】
  • 各国竞争的下一代液晶技术:中国铁电液晶取得重大突破突破
  • python和风api获取天气(JSON Web Token)
  • PostgreSQL如何更新和删除表数据
  • 【达梦数据库】内存使用资源评估
  • 图片压缩工具 | 发布到咸鱼并配置网盘自动发货
  • 通义灵码2.5——基于MCP实现我的12306火车票智能查询小助手