在x86环境下制作ARM镜像包(如qemu.docker
),可以通过QEMU和Docker的结合来实现。以下是详细的步骤:
安装QEMU-user-static
QEMU-user-static是一个静态编译的QEMU二进制文件,用于在非目标架构上运行目标架构的二进制文件。首先需要在x86主机上安装并配置QEMU-user-static。
运行以下命令来安装并配置QEMU-user-static:
bash复制
docker run --rm --privileged multiarch/qemu-user-static --reset -p yes
或
docker run --rm --privileged multiarch/qemu-user-static:register
# 需要提前准备交叉编译环境,下载qemu-aarch64-static,并给qemu-aarch64-static提前赋予执行权限chmod +x qemu-aarch64-static
此命令会自动下载multiarch/qemu-user-static
镜像,并将其注册到binfmt_misc
,使QEMU能够模拟不同架构的程序。
下载镜像错误,提示信息如下
[root@localhost DockerFile]# docker run --rm --privileged multiarch/qemu-user-static --reset -p yes
Unable to find image 'multiarch/qemu-user-static:latest' locally
docker: Error response from daemon: Get "https://registry-1.docker.io/v2/": net/http: request canceled while waiting for connection (Client.Timeout exceeded while awaiting headers).
See 'docker run --help'.
错误修复(更换docker镜像加速器)
[root@localhost DockerFile]# cd /etc/docker
[root@localhost docker]# ll
total 0
[root@localhost docker]# cat /etc/docker/daemon.json
cat: /etc/docker/daemon.json: No such file or directory
[root@localhost docker]# sudo mkdir -p /etc/docker
[root@localhost docker]# sudo tee /etc/docker/daemon.json <<-'EOF'
> {
> "registry-mirrors": ["https://docker.m.daocloud.io"]
> }
> EOF
{
"registry-mirrors": ["https://docker.m.daocloud.io"]
}
[root@localhost docker]# sudo systemctl daemon-reload
[root@localhost docker]# sudo systemctl restart docker
构建ARM镜像
在QEMU-user-static配置完成后,可以通过Docker构建ARM架构的镜像。以下是一个简单的示例,展示如何构建一个ARM64架构的Ubuntu镜像。
创建Dockerfile
创建一个Dockerfile,指定基础镜像为ARM架构的Ubuntu镜像:
dockerfile复制
FROM arm64v8/ubuntu:latest
RUN apt-get update && apt-get install -y curl
构建镜像
使用以下命令构建镜像,指定目标平台为linux/arm64
:
bash复制
docker buildx build --platform linux/arm64 -t my-arm-image .
此命令会使用QEMU模拟ARM64环境来构建镜像。
运行ARM镜像
构建完成后,可以运行该ARM镜像来验证是否成功:
bash复制
docker run --rm --platform linux/arm64 my-arm-image uname -m
如果一切正常,输出应为aarch64
。