首页 > 解决方案 > 在 Docker 中为 x86_64 机器上的 Raspberry Pi Zero 构建 Python 轮子

问题描述

我希望这是我提出问题的合适场所。这个谜题有很多部分。

我正在使用 Docker 构建一个容器,该容器注定要在 Raspberry Pi Zero 上运行。RPi Zero 有一个 ARMv6 硬浮点处理器。该容器将运行一个 Python 程序,其中包含一些必须编译的依赖项(使用二进制库)。我能够在 RPi Zero 本身上构建和运行容器,但是构建容器实际上需要几个小时。我希望 1) 加快构建过程,2) 允许这在 CI 环境中发生。

我过去用来构建具有需要编译的依赖项的最小 Python 容器的方法是使用多阶段 Docker 构建。我首先启动一个带有完整工具链的容器,然后运行pip wheel将所有需求编译成 .whl 文件。然后我将 .whl 文件复制到最终容器中,使用典型的包管理器安装任何二进制库,然后指向pip install此缓存 ( --find-links=/wheels) 以安装 Python 依赖项。这种方法在 Pi 上也可以正常工作,但正如我所说,这需要很长时间。

我考虑了一些我可以采取的不同方法:

  1. 弄清楚如何在我的主要开发机器(也在 CI 中)上运行 Docker 引擎并使用qemu-arm-staticwhile running构建 ARM 映像docker build,然后以某种方式将生成的映像标记为 ARMv6 并以某种方式将其上传到我的注册表。(我可以只使用标签或不同的 repo 名称)老实说,我并没有对此进行深入研究,但我主要担心的是,我看到的每个示例qemu-arm似乎都表明它运行 ARMv 7仿真。由于这个原因,RPi Zero 实际上甚至无法运行许多可用于 ARM 的 Docker 容器(退出 139)。“arm32v6用户”确实提供了在 RPi Zero 上运行良好的工作基础图像,这就是我在我的 Pi 本身上构建的源图像。
  2. qemu-system-arm使用.模拟整个 RasPi 尽管如此,它看起来像是在模拟 ARMv7,这意味着编译后的轮子可能无法在 Pi 零上运行。
  3. 为 ARMv6 设置交叉编译工具链。一些问题:我不知道如何确保pip在编译时使用该工具链,而且我需要获取和编译任何其他依赖库(甚至可能一直到 glibc?)所以头文件将解析.

如果您想为 ARMv7(我相信 RPi 2 使用)或更高版本执行此操作,看起来这很容易,但我专门为我的项目使用零,所以我没有那个选项。

TL;博士:我如何使用 Docker 为 ARMv6 构建二进制 Python 轮子,而不必在缓慢的单核 Raspberry Pi 零上进行?

标签: dockerpython-wheelarmv6raspberry-pi-zero

解决方案


推荐阅读