【问题标题】:How to install qemu emulator for arm in a docker container如何在 docker 容器中为 arm 安装 qemu 模拟器
【发布时间】:2022-01-15 07:46:36
【问题描述】:

我的目标是构建一个Docker Build 映像,该映像可用作能够构建多架构映像的 CI 阶段。

FROM public.ecr.aws/docker/library/docker:20.10.11-dind

# Add the buildx plugin to Docker
COPY --from=docker/buildx-bin:0.7.1 /buildx /usr/libexec/docker/cli-plugins/docker-buildx

# Create a buildx image builder that we'll then use within this container to build our multi-architecture images
RUN docker buildx create --platform linux/amd64,linux/arm64 --name=my-builder --use

^ 构建我需要的容器,但不包括arm64 的模拟器。这意味着当我尝试通过docker buildx build --platform=$SUPPORTED_ARCHITECTURES --build-arg PHP_VERSION=8.0.1 -t my-repo:latest . 之类的命令使用它来构建多架构映像时,会出现错误:

error: failed to solve: process "/dev/.buildkit_qemu_emulator /bin/sh -c apt-get update && apt-get -y install -q ....

解决方案是运行 docker run --rm --privileged tonistiigi/binfmt --install arm64 作为 CI 步骤的一部分,它使用我之前构建的 buildx 容器。但是,真的想通过在 Dockerfile 中添加类似这样的内容来了解​​为什么模拟器似乎无法安装在容器中

# Install arm emulator
COPY --from=tonistiigi/binfmt /usr/bin/binfmt /usr/bin/binfmt
RUN /usr/bin/binfmt --install arm64

【问题讨论】:

    标签: docker buildx


    【解决方案1】:

    我真的很想了解为什么模拟器似乎无法安装在容器中

    因为当您执行RUN 命令时,结果是从该步骤捕获文件系统更改,并将它们保存到映像中的新层。但是 qemu setup 命令并没有真正修改文件系统,它正在修改主机内核,这就是它需要--privileged 才能运行的原因。配置 qemu 后,您将在主机上的 /proc/sys/fs/binfmt_misc/ 中看到这些内核更改的证据。无法将该标志指定为容器构建的一部分,在 Dockerfile 中运行的所有步骤都是非特权的,无法访问主机设备或更改主机内核。

    CI 系统的标准做法是提前配置好主机,然后运行 ​​docker build。在 GitHub Actions 中,这是在运行构建步骤之前使用 setup-qemu-action 完成的。

    【讨论】:

      猜你喜欢
      • 2017-11-11
      • 2019-12-05
      • 2023-03-14
      • 2019-04-12
      • 2021-09-08
      • 1970-01-01
      • 1970-01-01
      • 2022-07-13
      • 2017-08-27
      相关资源
      最近更新 更多