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

标签 docker go cross-compiling cpu-architecture

巧合的是,我今天发现在我的 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/

相关文章:

c# - docker : "npm not found"

go - 在 Go 中使用指向字符串的指针而不是字符串有什么好处

python - 在 win32 中编译 python-mcrypt?

并发和 slice 迭代

linux - ARM 交叉编译器找不到包含的标准库

cross-compiling - 目标架构三元组中 "pc"的含义

postgresql - 如何使用 sqlalchemy 在 Docker 中访问 postgresql?

linux - Docker 容器中的 HTTPS 服务器

docker - 在Docker中安装Rcpp软件包会导致安装过程卡住

pointers - 测试嵌套结构中的 nil 值