1. 需求背景
当在无代理的环境因网络问题不方便拉取某些docker镜像时候,可以在有代理的环境拉取需要的镜像,再上传到需要的环境。
此时在本地(如 Apple Silicon M1/M2/M3 Mac)导出镜像并在 x86 架构服务器上运行时,可能会遇到 exec format error。这是因为架构不匹配导致的。本指南介绍如何正确打包指定架构的镜像。
2. 本地环境:拉取并导出正确架构镜像
在你的 本地电脑 (Mac/PC) 上执行以下操作。关键在于使用 --platform 参数强制指定目标服务器的架构。
本文 以nginx作为示例
第一步:拉取 x86_64 镜像
强制拉取适用于 Intel/AMD 架构的镜像:
# 拉取 nginx 服务器镜像
docker pull --platform linux/amd64 nginx:latest
第二步:保存为 Tar 文件
将镜像保存为 tar 文件:
# 将镜像保存为 tar 文件
docker save nginx:latest > nginx-x86.tar
3. 服务器环境:加载与验证
在你的 x86_64 服务器 上执行以下操作。
加载新镜像
将本地生成的 .tar 文件上传至服务器后运行:
# 加载镜像
docker load < nginx-x86.tar
架构验证(关键)
检查加载后的镜像架构是否确认为 amd64:
docker image inspect nginx:latest | grep Architecture
预期输出:
"Architecture": "amd64"
4. 启动容器
现在你可以正常使用nginx 镜像了,Docker 不会再尝试联网拉取;解决了无代理情况下镜像使用。
5. 常见问题排查
为什么不加 --platform 也会拉取成功?
Docker 默认会下载与当前宿主机匹配的架构。在 Mac M1 上默认下载 ARM64,在 Intel 服务器上默认下载 AMD64。跨机迁移必须手动指定。
服务器空间不足?
加载完镜像后,可以删除 .tar 文件以节省空间:
rm *.tar
Error response from daemon: unable to create manifests file: NotFound: ...
在 执行 docker save ... 的时候可能报错:Error response from daemon: unable to create manifests file: NotFound: content digest sha256:378f275f52cbbc5cebdf84b5c4fe51544f28e698e05db75588a82d4cfeb44542: not found
此时解决方法如下:
使用的是较新版本的 Docker Desktop,可能开启了 "Use containerd for pulling and storing images" 选项。这个选项有时会导致 inspect 结果异常。
1. 点击 Docker 图标 -> Settings -> General;
2. 查看 "Use containerd for pulling and storing images" 是否勾选;
3. 尝试: 如果勾选了,请取消勾选并重启 Docker,然后重新 pull;
4. 然后再执行接下来的步骤,即可正常。