这可能更通用,可以使用机器架构 A 为架构 B 构建一个映像。我目前想创建一个具有大量 Python 依赖项的映像。在树莓派上需要一些时间,但在 Mac 上速度更快。当我最后遇到错误时,我们需要重建。有没有办法在 Mac 上构建此映像,然后将其拉到我的树莓派上?
模拟完整的替代架构通常非常慢。 QEMU 允许您在 Linux 上执行此操作,并且可以集成到 Docker 容器中。
对于构建,您可以使用QEMU User Emulation,它比完全模拟快得多。这允许您的硬件直接执行 ARM 二进制文件,并用于简化交叉编译和交叉调试。
首先获取 VirtualBox 和 获取 Vagrant 并安装。 (或者使用 Docker Toolbox
中的
docker-machine
)
设置您的虚拟机
mkdir raspbian-docker
cd raspbian-docker
vagrant init debian/jessie64
vagrant up
vagrant ssh
现在您已在 Debian Linux VM 上,设置 Docker 主机
sudo su -
apt-get install qemu-user-static
curl https://get.docker.com/ | sh
运行raspbian环境
docker run -ti \
--volume /usr/bin/qemu-arm-static:/usr/bin/qemu-arm-static \
philipz/rpi-raspbian \
bash
并做你需要做的事情。
docker export
和 docker import
移动图像。您还可以使用 集线器 或 设置注册表 来使用 push
/pull
Docker Toolbox 还可以让你在 mac 上通过 VirtualBox VM 轻松运行 Docker,但我遇到的麻烦比它值得的更多(当你有 vagrant 设置时)。
https://github.com/RPi-Distro/pi-gen 它在 Docker 上使用 qemu-debootstrap,类似于 Matt 的答案。
如果您还计划为arm架构构建Docker镜像,qemu-debootstrap不会有帮助。在这种情况下,您可以直接在 ARM 服务器上运行 Docker 构建,例如 Scaleway 提供的服务器。我的 CI 服务器运行上述的组合,以持续构建带有预加载的 armh docker 映像的操作系统映像。然后,
device-init负责将 docker 导出加载为 docker 镜像。 缺点是首次启动后,device-init 可能需要几个小时来预加载 docker 映像。
buildx 插件,从具有不同架构的主机创建特定架构的映像(或多架构映像)要简单得多。例如,可以使用以下命令从 linux/arm64
笔记本电脑(Intel Mac、PC 等)构建
linux/amd64
映像(配备 Apple M 系列处理器、AWS graviton 实例等的 Mac 所需):
docker buildx create --name custombuilder \
--driver docker-container --use --bootstrap
docker buildx build --platform linux/arm64 \
--push -t example:latest .