gpt4 book ai didi

docker - 我可以设置 arm64 docker 镜像,但无法运行任何内容

转载 作者:行者123 更新时间:2023-12-03 08:05:40 43 4
gpt4 key购买 nike

我有一个 CentOS 7 x86_64 虚拟机。我需要在 Oracle Linux 8 arm64 docker 容器中执行一些操作。

我安装了docker和qemu:

$ sudo yum install -y yum-utils
$ sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
$ sudo yum install -y docker-ce docker-ce-cli containerd.io docker-compose-plugin \
qemu-system-arm qemu qemu-user qemu-kvm qemu-kvm-tools libvirt virt-install \
libvirt-python libguestfs-tools-c

然后我启动了 docker 并设置了 qemu-user-static:

$ sudo systemctl start docker
$ docker run --rm --privileged multiarch/qemu-user-static --reset

我的 Dockerfile 是:

FROM oraclelinux:8.5
ENV container docker
RUN dnf -y install sssd nscd unzip zip xz which file
RUN useradd --uid 1001 -ms /bin/bash cm
RUN uname -m

然后使用以下命令创建 x86_64 和 arm64 镜像:

docker buildx create --name ol8_builder
docker buildx --builder ol8_builder build -t frickson/oracle8 . --platform=linux/amd64 --load --progress=plain
docker buildx --builder ol8_builder build -t frickson/oracle8arm . --platform=linux/arm64 --load --progress=plain

在两个镜像的构建过程中,RUN useradd 起作用并创建用户。 RUN uname -m 在两个系统上都可以工作,产生正确的输出(分别为 x86_64aarch64)。

x86_64 机器正常工作:

$ docker run --rm --privileged frickson/oracle8 uname -m
x86_64

但是arm64机器没有:

$ docker run --platform linux/arm64 --rm --privileged frickson/oracle8arm uname -a
exec /usr/bin/uname: no such file or directory

我猜它没有找到一个或多个库,因为它在图像构建期间工作。尝试运行任何命令(bashlstrue)都会导致相同的错误消息。

我缺少什么想法吗?谢谢!

编辑:回应@JosephSible-ReinstateMonica:

没成功。而且我无法访问 ARM 主机来检查我的镜像。

$ sudo docker run --platform linux/arm64 -it --rm --privileged oraclelinux:8 /bin/bash
Unable to find image 'oraclelinux:8' locally
8: Pulling from library/oraclelinux
e12ce518ed4b: Pull complete
Digest: sha256:cad3a3dc2dd9f03dec02642dce1f194562e7f21820bc36ceb9f7b070d337fb45
Status: Downloaded newer image for oraclelinux:8
exec /bin/bash: no such file or directory

最佳答案

当您运行docker run --rm --privileged multiarch/qemu-user-static --reset时,它将aarch64二进制文件的处理程序设置为:

[root@localhost ~]# cat /proc/sys/fs/binfmt_misc/qemu-aarch64
enabled
interpreter /usr/bin/qemu-aarch64-static
flags:
offset 0
magic 7f454c460201010000000000000000000200b700
mask ffffffffffffff00fffffffffffffffffeffffff

不幸的是,CentOS 7 没有这些二进制文件的 -static 版本:

[root@localhost ~]# ls /usr/bin/qemu-aarch64*
/usr/bin/qemu-aarch64

幸运的是,multiarch/qemu-user-static 容器包含镜像中必要的二进制文件;您可以像这样复制到您的主机上:

$ docker run --rm  --entrypoint tar multiarch/qemu-user-static \
-C /usr/bin -cf- . | tar -C /usr/bin -xf-

现在我们有:

[root@localhost bin]# ls /usr/bin/qemu-aarch64*
/usr/bin/qemu-aarch64 /usr/bin/qemu-aarch64_be-static /usr/bin/qemu-aarch64-static

这让我们如此接近,但我们需要将静态二进制文件安装到图像中,如 docs for multiarch/qemu-user-static 中所述。 :

[root@localhost bin]# docker run --platform linux/arm64 --rm -v /usr/bin/qemu-aarch64-static:/usr/bin/qemu-aarch64-static  oraclelinux:8.5 uname -a
Linux 2d7e2e0ce6d7 3.10.0-1160.66.1.el7.x86_64 #1 SMP Wed May 18 16:02:34 UTC 2022 aarch64 aarch64 aarch64 GNU/Linux

(或者您需要将解释器构建到图像中。)

我们需要在 CentOS 7 上的容器内挂载 qemu-aarch64-static,因为内核似乎不支持 binfmt_misc< 的 F 标志 解释器。 F 标志的含义是:

F - fix binary

The usual behaviour of binfmt_misc is to spawn the binary lazily when the misc format file is invoked. However, this doesn’t work very well in the face of mount namespaces and changeroots, so the F mode opens the binary as soon as the emulation is installed and uses the opened image to spawn the emulator, meaning it is always available once installed, regardless of how the environment changes.

(来自kernel documentation)

multiarch/qemu-user-static 将设置 F 标志(如果您设置)--persistent yes 在命令行上,但在 CentOS 7 上失败并显示:

$ docker run --rm --privileged multiarch/qemu-user-static --reset
--persistent yes
...
Setting /usr/bin/qemu-aarch64-static as binfmt interpreter for aarch64
sh: write error: Invalid argument

对于最近的 Fedora 发行版(可能还有其他发行版),您只需安装 qemu-user-static 软件包,一切就可以正常工作(无需使用 multiarch/qemu -用户静态图像):

$ cat /etc/fedora-release
Fedora release 34 (Thirty Four)
$ rpm -q qemu-user-static
qemu-user-static-5.2.0-9.fc34.x86_64
$ uname -m
x86_64
$ docker run --platform linux/arm64 --rm oraclelinux:8.5 uname -a
Linux 6f04d17234f5 5.17.6-100.fc34.x86_64 #1 SMP PREEMPT Mon May 9 14:41:31 UTC 2022 aarch64 aarch64 aarch64 GNU/Linux

qemu-user-static 软件包安装所有 binfmt_misc为您注册。

关于docker - 我可以设置 arm64 docker 镜像,但无法运行任何内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72455086/

43 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com