关于 Golang 编译器的 docker 个容器内的系统架构

System architecture inside docker containers with regards to Golang compilers

巧合的是,我今天发现在我的 MacBook Pro 2017 上使用两种不同架构交叉编译的两个二进制文件都在同一个 ubuntu:latest docker 容器中工作。事情是这样的:

我首先编译了一个hello-world 运行 env GOOS=linux GOARCH=amd64 go build,让我们把这个二进制文件称为A。然后我编译了同样的hello-world程序运行 env GOOS=linux GOARCH=arm64 go build,让将此二进制文件称为 B.

我检查了 A 和 B 的 md5sum 并确保它们是不同的二进制文件。我将这两个二进制文件复制到相同的 docker 容器 运行 ubuntu:latest 作为其基础,期望 B 在执行时失败。然而,他们都被完美地执行了。

同样,使用 env GOOS=linux GOARCH=ppc64 go build 编译的二进制文件不会在同一个 docker 容器中执行。有谁知道这是为什么?


作为参考,uname -sm 在我的 MacBook 上的输出为 Darwin x86_64。我的 docker 容器 运行 ubuntu:latestuname -sm 的输出给出 Linux x86_64

Docker仅支持ppc64le。更多信息在这里:https://docs.docker.com/docker-for-mac/multi-arch/

似乎早在 1.13 中就添加了此功能,但 docker 本周宣布,为了让开发人员无缝使用此功能还有很多工作要做。来自 Docker for Mac release notes:

Support for arm, aarch64, ppc64le architectures using qemu

在这种情况下发生的事情是 binfmt_misc qemu 用于允许从其他体系结构执行程序。这需要在主机上进行更改,这就是为什么您在 Linux.

中尝试对其他架构执行 运行 命令时经常出错的原因