问题描述
我正在从 Windows 10 构建 linux/arm/v7
映像,以便在运行 32 位操作系统的 RaspBerry Pi 上运行。
Dockerfile
FROM Nginx:1.19.8-alpine
CMD Nginx -g 'daemon off;'
构建和推送
在 Windows 上,我运行:
docker buildx build --platform linux/arm/v7 -t harvzor/Nginx-multi-arch-cross-compile --push .
在构建的镜像上运行 docker inspect image harvzor/Nginx-multi-arch-cross-compile
会产生:
[
{
// ...
"Architecture": "arm","Os": "linux",// ...
}
]
Docker Hub 将映像标识为基于 arm
。
https://hub.docker.com/repository/docker/harvzor/nginx-multi-arch-cross-compile
拉动并运行(错误!)
然后我在 RaspBerry Pi 上拉下相同的图像并尝试运行它,这是输出:
$ docker run harvzor/Nginx-multi-arch-cross-compile
standard_init_linux.go:211: exec user process caused "exec format error"
Failed to resize tty,using default size
详情
我的图像基于 nginx:1.19.8-alpine,它具有 linux/arm/v7
OS/ARCH。
在 Windows 上检查 buildx 会产生:
$ docker buildx inspect
Name: default
Driver: docker
Nodes:
Name: default
Endpoint: default
Status: running
Platforms: linux/amd64,linux/arm64,linux/riscv64,linux/ppc64le,linux/s390x,linux/386,linux/arm/v7,linux/arm/v6
如果我尝试在 Windows 上运行此映像,它运行良好(尽管我认为它不应该,因为它是为 arm 构建的)。
Windows Docker 版本
$ docker -v
Docker version 19.03.13,build 4484c46d9d
docker buildx version
github.com/docker/buildx v0.4.2-tp-docker fb7b670b764764dc4716df3eba07ffdae4cc47b2
问题
我做错了什么? 为什么映像适用于 Windows 而不是目标平台?
解决方法
我仍然不知道发生了什么,但 Windows 肯定是为错误的目标平台构建的。
在 Windows 上运行:
$ docker run harvzor/nginx-multi-arch-cross-compile@sha256:20a63dd8ee5daab206baef00bffc9bf316a93ebca452ff531c0202f6c22ee0c1 uname -m
x86_64
很明显创建了错误的图像。
我想我会测试为多个平台构建:
docker buildx build --platform linux/amd64,linux/arm/v7 -t harvzor/nginx-multi-arch-cross-compile --push .
这次跑了linux/arm/v7
:
$ docker run harvzor/nginx-multi-arch-cross-compile@sha256:64c586e218d433680dd13aa92f4e47ddd3a29147049f728b10a2b5070225d22b uname -m
armv7l
终于创建了正确的版本。
请注意,我很确定我也遇到过这种情况,即由 CI 构建的 Rust Docker 映像也无法在我的 Pi 上运行!