首页 > 解决方案 > 关于 Golang 编译器的 docker 容器内的系统架构

问题描述

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

我首先编译了一个 hello-world running env GOOS=linux GOARCH=amd64 go build,我们称之为二进制 A。然后我编译了相同的 hello-world 程序 running 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. uname -sm在我的 docker 容器中运行的输出ubuntu:latest给出了Linux x86_64

标签: dockergocross-compilingcpu-architecture

解决方案


看起来这个功能是在 1.13 中添加的,但是为了让 docker 本周宣布的开发人员无缝连接,还有很多工作要做。来自Docker for Mac 发行说明

使用 qemu 支持 arm、aarch64、ppc64le 架构

在这种情况下发生的情况是binfmt_misc和 qemu 用于允许从其他架构执行程序。这需要在主机上进行更改,这就是为什么在 Linux 中尝试运行其他架构的命令时经常会出错的原因。


推荐阅读