巧合的是,我今天发现在我的 MacBook Pro 2017 上使用两种不同架构交叉编译的两个二进制文件都在同一个 ubuntu:latest
docker 容器中运行。这是发生的事情:
我首先编译了一个运行 env GOOS=linux GOARCH=amd64 go build
的 hello-world,我们称之为二进制 A。然后我编译了相同的运行 env GOOS= 的 hello-world 程序linux GOARCH=arm64 go build
,我们称这个二进制文件为 B。
我检查了 A 和 B 的 md5sum 并确保它们是不同的二进制文件。我将这两个二进制文件复制到同一个以 ubuntu:latest
为基础运行的 docker 容器中,期望 B 在执行时失败。然而,他们都被完美地执行了。
同样,使用 env GOOS=linux GOARCH=ppc64 go build
编译的二进制文件不会在同一个 docker 容器中执行。有谁知道这是为什么吗?
作为引用,uname -sm
在我的 MacBook 上的输出为 Darwin x86_64
。在运行 ubuntu:latest
的 docker 容器中 uname -sm
的输出为 Linux x86_64
最佳答案
看起来此功能早在 1.13 中就已添加,但 docker 本周宣布的开发人员还需要做很多工作来实现无缝连接。来自Docker for Mac release notes :
Support for arm, aarch64, ppc64le architectures using qemu
在这种情况下发生的是 binfmt_misc qemu 用于允许从其他体系结构执行程序。这需要对主机进行更改,这就是为什么在 Linux 中尝试为其他体系结构运行命令时经常会出错的原因。
关于docker - 关于 Golang 编译器的 docker 容器内的系统架构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55961931/