我有一个CentOS 7 x86_64虚拟机。我需要在OracleLinux8 arm64停靠容器中做一些事情。
我安装了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-用户静态:
$ 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_64
和aarch64
)。
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
我猜它找不到一个或多个库,因为它在映像构建过程中工作。尝试运行任何命令(bash
、ls
、true
)都会产生相同的错误消息。
知道我错过了什么吗?谢谢!
编辑:回复@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
发布于 2022-06-01 04:19:26
运行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
这使我们非常接近,但是我们需要像多弓/qemu的文档-用户静态中所描述的那样将静态二进制文件挂载到映像中。
[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
(或者您需要将解释器构建到图像中。)
我们需要在qemu-aarch64-static
7的容器中挂载CentOS,因为内核似乎不支持binfmt_misc
解释器的F
标志。F
标志意味着:
F - fix二进制 binfmt_misc的通常行为是在调用misc格式文件时懒洋洋地生成二进制文件。但是,这在挂载名称空间和changeroots面前不能很好地工作,因此F模式在模拟安装后立即打开二进制文件,并使用打开的映像生成仿真器,这意味着无论环境如何变化,一旦安装,它总是可用的。
(来自内核文档)
如果在命令行上设置了multiarch/qemu-user-static
,则multiarch/qemu-user-static
将设置--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-user-static
映像):
$ 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
注册。
https://stackoverflow.com/questions/72455086
复制相似问题