Skip to content

如何在AMD64服务器上构建ARM64架构的镜像

简介

在drone CI的持续集成环境中,部署不同CPU架构的runner实在太麻烦了,于是研究是否可以直接在AMD64架构的runner上直接构建ARM64镜像。

修改docker配置

修改daemon.json文件,开启expreimental功能

json
{
    "experimental": true
}

修改完成后,重启docker验证修改是否生效

sh
/etc/init.d/docker restart
docker info | grep -i 'experimental'

拉取ARM64架构镜像

拉取arm平台镜像

sh
docker pull --platform arm64 alpine:3.19

查看镜像使用的平台

sh
docker inspect alpine:3.19 | grep -i 'architecture'

尝试运行arm平台的容器

sh
docker run --rm --platform arm64 -t alpine:3.19 uname -m

因CPU架构不同而返回报错如下

exec /bin/uname: exec format error

注册可支持的架构解释器

不指定CPU平台,使用register来注册可支持的架构解释器

sh
docker run --rm \
--privileged \
multiarch/qemu-user-static:register \
--reset

下载ARM64的架构解释器

sh
mkdir /opt/multiarch && \
cd /opt/multiarch && \
wget https://github.com/multiarch/qemu-user-static/releases/download/v7.2.0-1/qemu-aarch64-static && \
chmod +x qemu-aarch64-static

尝试用qemu-aarch64-static启动容器

sh
docker run -t \
--rm \
--platform arm64 \
-v /opt/multiarch/qemu-aarch64-static:/usr/bin/qemu-aarch64-static \
alpine:3.19 \
uname -m

构建一个ARM64镜像

准备一个docker文件

FROM alpine:3.19
ADD /opt/multiarch/qemu-aarch64-static /usr/bin/qemu-aarch64-static

运行构建命令

sh
docker build \
--platform arm64 \
-t alpine:3.19_arm64 .

查看构建出的镜像使用的平台

sh
docker inspect alpine:3.19_arm64 | grep -i 'architecture'