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

时间:2019-05-03 00:43:59

标签: docker go cross-compiling cpu-architecture

巧合的是,我今天发现在MacBook Pro 2017上使用具有两种不同体系结构的交叉编译功能编译的两个二进制文件都在同一个ubuntu:latest Docker容器中工作。这是发生了什么:

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

我检查A和B的md5sum,并确保它们是不同的二进制文件。我将这两个二进制文件都复制到了以ubuntu:latest为基础运行的同一个Docker容器中,期望B在执行时失败。但是,它们都执行得很好。

类似地,使用env GOOS=linux GOARCH=ppc64 go build编译的二进制文件将不会在同一docker容器内执行。有人知道为什么吗?


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

2 个答案:

答案 0 :(得分:1)

该功能似乎早在1.13中就已添加,但要做更多工作以使docker本周宣布的开发人员无缝连接。来自Docker for Mac release notes

  

使用qemu支持arm,aarch64,ppc64le体系结构

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

答案 1 :(得分:0)

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