从 Windows 构建 arm Docker 映像在目标机器上不起作用

问题描述

我正在从 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 上运行!

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...