首先,需要一套环境,目前已有指定的镜像
要在 Docker 中运行 ARM 镜像,我们要先在计算机上注册 qemu-user-static 虚拟机:
docker run --rm --privileged multiarch/qemu-user-static:register --reset
另外,Docker 镜像内必须也含有对应的 qemu-user-static 虚拟机。不过,Docker Hub 上已经有了添加 qemu-user-static 的系统镜像,可以在 https://hub.docker.com/u/multiarch/ 获取:
例如,multiarch/alpine 镜像就在不同 tag 下提供了 aarch64(armv8)、armhf、amd64、i386 的镜像
如果你之前已经注册了虚拟机,那么就可以直接运行了:
docker run -it --rm multiarch/alpine:armhf-edge /bin/sh docker run -it --rm multiarch/alpine:aarch64-edge /bin/sh
接下来就是修改 Dockerfile
接下来我们要在 Dockerfile 中调用 ARM 架构的镜像。如果你的 ARM 主机是 armv7l(armhf)架构(树莓派(默认),Tinker Board 等),那么把 Dockerfile 中的第一行修改成 https://hub.docker.com/u/multiarch/ 下对应的 armhf 架构镜像即可。对应关系如下:
- alpine -> multiarch/alpine:armhf-edge
- ubuntu:bionic -> multiarch/ubuntu-debootstrap:armhf-bionic
- debian:stretch -> multiarch/debian-debootstrap:armhf-stretch
如果你的 ARM 主机是 aarch64(armv8)架构(树莓派 3 开始支持,但是需要特殊系统才是这个架构),那么对应关系如下:
- alpine -> multiarch/alpine:aarch64-edge
- ubuntu:bionic -> multiarch/ubuntu-debootstrap:arm64-bionic
- debian:stretch -> multiarch/debian-debootstrap:arm64-stretch
改完后直接重新构建镜像,你就可以在本地生成 ARM 架构的镜像了。
接下来就是构建多合一镜像了:
这里需要用到一个工具:`manifest-tool`
简单的用法,写一个yaml的模板:例如 ddns.yaml
image: scjtqs/ddns:latest manifests: - image: scjtqs/ddns:amd64 platform: architecture: amd64 os: linux - image: scjtqs/ddns:i386 platform: architecture: 386 os: linux - image: scjtqs/ddns:armhf platform: architecture: arm os: linux - image: scjtqs/ddns:arm64 platform: architecture: arm64 os: linux
然后运行 manifest-tool push from-spec ddns.yaml