1

我正在linux/arm/v7从 Windows 10 构建一个映像,以在运行 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/v7OS/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 而不是目标平台上工作?

4

1 回答 1

0

我仍然不知道发生了什么,但 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 上运行!

于 2021-03-18T18:59:42.597 回答