Docker中的多平台如何工作?在Docker中使用多平台功能的最简单方法是从命令行调用它。使用Docker buildx,我们可以利用新的测试版功能。通过运行Docker buildx build –platform linux/arm/v7 -t arm-build。此命令使用ARMv7仿真根据当前目录中的”Dockerfile”构建Docker映像。在幕后,Docker在QEMU虚拟化环境中运行整个Docker构建过程。通过这样做,可以消除设置自定义VM的复杂性。一旦构建完成,我们甚至可以使用Docker RunARMv7模式自动启动容器。
多平台、多阶段和Qt虽然多平台功能是一个很棒的独立功能,但与多阶段构建结合使用时它会变得更加强大。在单个Dockerfile中,我们能够混合和匹配平台并在步骤之间进行复制。这个功能正是我们最终为Screenly OSE使用Qt构建过程所做的。
第一阶段:ARM
感谢Balena的优秀人员,我们能够在第一阶段使用Raspbian基础映像。我们可以使用以下方法调用此步骤:
FROM –platform=linux/arm/v7 balenalib/Rpi-Raspbian:buster as builder在上述步骤之后,我们可以像往常一样使用Docker并执行各种RUN命令,例如安装包等。请注意,如果构建不是在ARMv7硬件上运行,则此容器正在使用QEMU模拟运行。在我们的例子中,我们使用命令来安装Qt构建依赖项。上述步骤还允许我们完全消除从磁盘映像或Rsync物理Raspberry Pi的文件复制文件的需要。
第2阶段:x86一旦我们在ARM步骤中安装了依赖项,我们就可以切换到构建器的原生x86架构以避免仿真,并使用以下行进行交叉编译:
FROM –platform=linux/amd64 debian:buster现在,我们进入了有趣的部分。切换到x86后,我们可以复制上一步中的文件。我们这样做是为了创建一个可用于Qt的sysroot。我们通过运行以下命令来完成此步骤:
RUN mkdir -p /sysroot/usr /sysroot/opt /sysroot/lib
COPY –from=builder /lib/ /sysroot/lib/
COPY –from=builder /usr/include/ /sysroot/usr/include/
COPY –from=builder /usr/lib/ /sysroot/usr/lib/
COPY –from=builder /opt/vc/ sysroot/opt/vc/我们现在拥有两全其美的优势。通过利用多步骤和多平台功能,我们生成了一个可用于构建Qt的sysroot。由于我们在上一步中使用了功能齐全的Raspbian映像,我们甚至可以让Qt获取所有现有的库。
./configure -sysroot /sysroot正如我们在介绍中提到的,编译Qt远非简单。成功编译它需要很多步骤。