手臂, 码头工人, linux, e木

在x86中运行和构建ARM Docker容器

我们已经介绍了 Linux如何执行文件如何运行ARM二进制文件“natively” 在Linux中的最后两篇文章。我们最终在一个目录中透明地运行了整个ARM根文件系统 chroot监狱 使用QEMU用户模式和 binfmt_misc support.

现在我们已经介绍了所有内容,没有什么可以阻止我们将其应用于Docker容器。归根结底,容器是类固醇中的chroot,它们还与宿主共享内核,因此所有基本机制都保持不变。

运行ARM容器

如果你没有 ’尚未安装QEMU用户模式,默认情况下还将安装 binfmt_misc support.

# apt-get install qemu-user

现在,我们只需要将 e木-arm-static 容器中的解释程序。这就像在容器调用和安装中将其装入绑定一样容易!我们在x86机器上运行armhf容器。

$ docker运行-v / usr / bin / qemu-arm-static:/ usr / bin / qemu-arm-static--rm -ti arm32v7 / debian:stretch-slim
root@49176286e89e:/#

构建ARM容器

这有点棘手,因为我们需要将QEMU解释器复制到容器中。问题在于它向容器添加了〜5MiB,但是能够本地构建外部容器的好处是 巨大!

考虑以下简化的Dockerfile创建armhf Nginx容器

FROM arm32v7/debian:stretch-slim

COPY qemu-arm-static /usr/bin

RUN apt-get update;\
    apt-get install -y nginx;\
    echo "\ndaemon off;" >> /etc/nginx/nginx.conf

CMD ["nginx"]

我们最终得到了一个容器,该容器既可以在ARM设备中本地运行,也可以在配置正确的x86系统中运行 binfmt_misc 支持。 Not bad!

我们甚至可以在本地测试

码头工人 build . -t nginx-armhf:testing
docker run --rm -ti -d -p 80:80 nginx-armhf:testing
firefox localhost

现在,我们正在本地运行ARM nginx Web服务器。

这意味着我们可以使用自动化测试创建构建管道,而无需任何ARM板。所有自动化测试通过后,我们可以创建生产映像。

FROM nginx-armhf:testing

RUN rm /usr/bin/qemu-arm-static
码头工人 build . -t nginx-armhf:production
在Docker API中回收空间1.25+

如果我们真的想从qemu-arm-static回收那些多余的5MiB,可以使用新的实验性 –squash  flag.

码头工人 build --squash . -t nginx-armhf:production

老实说,是时候了,他们做了一些事情来帮助我们减小图像尺寸。层和层的堆积 他们拒绝 添加一个简单的 –chown  COPY命令的参数使Dockerfiles的创建成为一件黑手艺,您必须在一个RUN语句中将所有安装步骤(包括清理)链接在一起,因此否认了缓存大代码块的好处。

值得庆幸的是,他们开始做出反应,我们现在不仅  –chown , but also the –squash  构建命令的标志。为了使用它,我们需要启用实验功能。将以下内容添加到 daemon.json 文件,该文件可能不存在

{ "experimental": true }

之后,重新启动Docker守护程序。

在Docker API中回收空间<1.25

我们只剩下 旧的hacky方式 通过导出容器来展平图像

码头工人 container create --name nginx-armhf-container nginx-armhf:production
docker export nginx-armhf-container | docker import - nginx-armhf:raw

,最后重建元数据

FROM nginx-armhf:raw

CMD ["nginx"]
码头工人 build . -t nginx-armhf:latest

作者: nachoparker

谦虚地分享我认为有用的东西 [ 的github 码头工人hub ]

11 Comments

  1. 非常感谢您的发布!

    我在Ubuntu 16.04上尝试了此操作,第一步,我收到一条错误消息,指出`standard_init_linux.go:190:exec用户进程引起了“没有这样的文件或目录”`。似乎/ usr / bin / qemu-arm-static丢失了,我需要使用apt-get install qemu-user-static安装qemu-user-static。在那之后,我开始走了。

  2. 非常感谢那些帖子。很有用。

    同时,docker映像格式已获得对特定于平台的映像的某种支持。
    对于已经指定了平台标记的图像,您现在需要提供附加的(实验性)`–平台cli docker运行。

    例如。:
    泊坞窗运行–平台arm64 -v / usr / bin / qemu-arm-static:/ usr / bin / qemu-arm-static–rm -ti arm64v8 /蟒蛇:3.7

  3. 感谢这篇非常有帮助的文章。在某些机器上,我必须运行“ apt-get install qemu-user-static”而不是“ apt-get install qemu-user”。否则我会在docker build期间收到一个权限被拒绝的喜欢的错误。

  4. 大家好。

    感谢您的帖子。它’在我的发展中为我服务’我在做。很有用。

    注意,我尝试在Ubuntu 18.04上安装它,并需要使用以下命令安装qemu-user-static:
    apt-get install qemu-user-static

    由于文件夹不为空,因此必须能够在容器内装入该卷。

    谢谢您的问候。

  5. 我正在构建Pytorch,并使用-mfpu = neon-vfpv4标志会产生霓虹灯错误,并且说neon不是’t支持。这是因为使用了通用的armv32 cpu吗?无论如何,要重新获得支持?顺便说一句,你’我真的节省了我很多时间…用了3天的时间来编译pytorch供我们使用,在docker容器中花费了大约20分钟。

  6. 当我查看命令时,请多多包涵,但我听不懂:
    泊坞窗运行-v /usr/bin/qemu-arm-static:/usr/bin/qemu-arm-static –rm -ti arm32v7 / debian:stretch-slim
    我认为它应该在容器中运行arm32v7 / debian:stretch-slim的默认命令,并将x86机器中的/ usr / bin / qemu-arm-static映射到容器中的/ usr / bin / qemu-arm-static 。
    容器如何在模拟器中运行?

    1. I’对不起,我是在看书之前写的”如何在本地运行ARM二进制文件”…其中包含答案以及更多

发表评论

您的电子邮件地址不会被公开。 必需的地方已做标记 *