问题描述
我需要什么:
在 x86_64 机器上用于 raspBerry pi zero 的测试容器,它与 armv6l 的 qemu 仿真一起使用。
到目前为止我得到了什么:
带有测试代码的 Dockerfile
FROM python:3.7.9
copY hello.py ./
CMD [ "python3","./hello.py" ]
图像是用这个命令构建的:
docker buildx build --platform linux/arm/v6 -t test/hello --push .
在为 linux/arm/v6 上传并构建之后,我尝试使用以下命令运行它:
docker run --platform=linux/arm/v6 --rm -t test/hello uname -mpi
Output: armv7l unkNown unkNown
我已经设置了 qemu 和 binfmt,就像他们在 github 页面上所说的那样: https://github.com/docker/buildx#building-multi-platform-images
我不明白为什么输出是 armv7l,因为我做了所有事情来制作 armv6l 图像。我不知道我是否需要对docker或qemu本身进行调整。 我对 docker 的 buildx 系统以及如何在 qemu 下模拟容器很陌生,所以如果有人能帮我解决这个问题,我将不胜感激。
编辑:
多亏了 Peter,容器被迫使用 armv6l。
docker run -e QEMU_cpu=arm1176 --platform=linux/arm/v6 --rm -t test/hello uname -mpi
Output: armv6l unkNown unkNown
解决方法
uname 告诉你 'armv7l',因为你没有向 QEMU 指定它应该模拟任何特定的 CPU 类型,它的默认值是“我们可以模拟的所有功能”。
这应该不是问题,因为所有可以在 v6 CPU 上运行的软件都将在 v7 CPU 上运行。 (这就是为什么 QEMU 的默认设置是这样的:这意味着一般来说来宾程序都可以正常工作。)
我对 docker 不熟悉,但我怀疑它的“平台”参数只是配置容器内的代码是用来运行的。所以你有一个装满 v6 二进制文件的容器,它可以在 v6 CPU 或 v7 CPU 上运行。
如果您确实需要强制 QEMU 模拟 v6 CPU 而不是 v7 CPU,您可以将环境变量 QEMU_CPU 设置为“arm1176”,这将使 QEMU 模拟该特定 CPU。