3

我的目标是构建一个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
4

1 回答 1

4

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

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

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

于 2021-12-16T17:24:35.097 回答