【问题标题】:Building docker image FROM scratch using a buildroot linux使用 buildroot linux 从头开始​​构建 docker 映像
【发布时间】:2021-12-17 04:55:50
【问题描述】:

好的,这是一个复杂的话题,非常感谢所有花时间阅读本文的人。这一切都始于尝试从 python 脚本创建一个可执行文件以在目标架构上运行。

目标拱门是 arm64。我在 MAC 上完成所有这些工作。主要问题是目标设备使用 uclibc。如果它使用 glibc 或 musl,我将能够使用下面描述的 ubuntu 容器或带有 python 的 alpine 容器进行交叉编译。 (使用 pyinstaller 创建可执行文件)

我创建了一个 buildx 容器并在 arm64 架构上运行了一个 ubuntu 容器(已确认)。从那里我在 ubunutu 容器中使用一个名为 Buildroot 的工具来创建一个自定义的 linux 文件系统。经过漫长的等待创建“rootfs.tar”

现在好了,把所有非 docker 的东西都扔掉了。我将此 rootfs.tar 文件复制到我的主机并尝试构建一个映像来运行我的自定义 linux。

Docker 文件

FROM scratch
MAINTAINER peskyadmin
ADD rootfs.tar /

构建命令

docker buildx build -t "${DOCKER_USER}/testrtfs:latest" --platform linux/arm64 --push .

运行命令

docker run --privileged --entrypoint "/bin/sh" -it "$DOCKER_USER/testrtfs:latest" --platform linux/arm64

运行输出

WARNING: The requested image's platform (linux/arm64) does not match the detected host platform (linux/amd64) and no specific platform was requested
standard_init_linux.go:228: exec user process caused: exec format error

使用最新版本的 Docker Desktop。我认为警告不是问题,因为当我运行使用 buildx 创建的 ubunutu 容器时,它会显示相同的错误消息,但正在目标架构上运行

我的问题是我做错了什么?我不明白这个错误。我的直觉告诉我这个问题与 dockerfile 有关,但我不确定,因为在使用 buildroot 创建 rootfs.tar 时这可能是一个问题?

目标 cpu 是一个 cortex A53,与树莓派 3 中的相同。我想我可以尝试将映像直接安装到裸机 pi 上,然后尝试在那里进行交叉编译。但我真的很想在我的 Mac 上保持一切虚拟化。

【问题讨论】:

  • 问题是什么?
  • @DanielCampos 我更新了我的问题以更直接。
  • 问:简单地确保您的目标安装了 Python 不是更容易/更高效/更健壮吗?

标签: linux docker dockerfile buildroot


【解决方案1】:

不需要任何容器。 Buildroot(和其他构建系统)会进行交叉编译,这意味着您可以针对与您构建的机器不同的目标进行构建。

换句话说,您只需选择 arm64 作为目标架构,进行构建,然后在您的目标上安装生成的 rootfs。

但是,这个rootfs完全替换了目标rootfs,所以目标是uclibc是没有关系的。所以我的猜测是你只想安装一个可执行文件。对于共享库,这样做变得更加困难,因为您不仅需要复制可执行文件,还需要复制它链接的任何库。因此,将 Buildroot 配置为静态链接 (BR2_STATIC_LIBS) 可能会有所帮助。

-编辑-

如果你想运行与目标类似的环境,除非你的构建机器也是 arm64,否则无法在 docker 中运行它。这就是警告“请求的图像平台(linux/arm64)与检测到的主机平台(linux/amd64)不匹配”的意思。您需要使用虚拟化而不是 docker,例如qem。

您可以使用make qemu_aarch64_virt_defconfig 为 arm64 建立一个 qemu 环境。查看 board/qemu/aarch64-virt/readme.txt 了解如何启动 qemu。

【讨论】:

  • 我没有尝试为目标系统编译 rootfs。我正在尝试构建一个具有匹配 uclibc 以及 python 和 gcc 的“Like 系统”。这是因为当我运行 pyinstaller 时,我会根据当前系统为目标创建一个可执行文件。我无法在目标上执行此过程,因为它无法安装 python。但我似乎无法获得所有 3 个
  • 问:为什么不能安装Python?请澄清。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-03-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-08-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多