docker - 关于 Golang 编译器的 docker 容器内的系统架构
问题描述
巧合的是,我今天发现在我的 MacBook Pro 2017 上使用交叉编译与两种不同架构编译的两个二进制文件都在同一个ubuntu:latest
docker 容器中工作。这是发生的事情:
我首先编译了一个 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
解决方案
看起来这个功能是在 1.13 中添加的,但是为了让 docker 本周宣布的开发人员无缝连接,还有很多工作要做。来自Docker for Mac 发行说明:
使用 qemu 支持 arm、aarch64、ppc64le 架构
在这种情况下发生的情况是binfmt_misc和 qemu 用于允许从其他架构执行程序。这需要在主机上进行更改,这就是为什么在 Linux 中尝试运行其他架构的命令时经常会出错的原因。
推荐阅读
- css - 如何在 CSS 中选择孩子
- google-chrome - 为什么 Google Chrome 和其他浏览器在 Accept-Language 标头中发送首选语言代码时不遵循 RFC 5646?
- python - 我使用 selenium 进行抓取,但在 56 个列表中我只能获得 40 个列表。但是所有 56 个列表的类名都相同
- python - Pandas 生成带有标题和特定结构的报告
- google-bigquery - BigQuery 性能对列数据长度的影响
- kubernetes - CoreDNS pod 卡在 ContainerCreating - Kubernetes
- python - [Flask SocketIO]dns.name.EmptyLabel:DNS 标签为空
- python - 根据 Python 中的其他列分配新列
- python - 收集浏览器中显示但不响应的数据
- python - 暂停 python 脚本以保存输出