在构建多架构(Multi-Arch)的容器镜像的时候,如果我们使用的base镜像已经支持multi-arch的那么我们可以用一个dockerfile来build不同架构的容器镜像。比如jmeter的docker镜像justb4/jmeter,它的dockerfile里base镜像alpine:3.9,那么我们只需要在不同平台的机器运行docker build命令,然后按照上一节文章内容制作出多架构镜像。
还有一种就是dockerfile里的base镜像本身不是multi-arch的,那么我们需要采用另外一种办法.使用一个Dockerfile模板,可以命名为 Dockerfile.cross
里边的内容可以象下面那样
FROM __BASEIMAGE_ARCH__/alpine:3.7
__CROSS_COPY qemu-__QEMU_ARCH__-static /usr/bin/
RUN apk --no-cache --update add nginx
EXPOSE 80
CMD ["nginx", "-g", "deamon off;"]
然后用一个简短的build.sh脚本
for docker_arch in amd64 arm32v6 arm64v8; do
case ${docker_arch} in
amd64 ) qemu_arch="x86_64" ;;
arm32v6 ) qemu_arch="arm" ;;
arm64v8 ) qemu_arch="aarch64" ;;
ppc64le) qemu_arch="ppc64le" ;;
esac
cp Dockerfile.cross Dockerfile.${docker_arch}
sed -i "" "s|__BASEIMAGE_ARCH__|${docker_arch}|g" Dockerfile.${docker_arch}
sed -i "" "s|__QEMU_ARCH__|${qemu_arch}|g" Dockerfile.${docker_arch}
if [ ${docker_arch} == 'amd64' ]; then
sed -i "" "/__CROSS_/d" Dockerfile.${docker_arch}
else
sed -i "" "s/__CROSS_//g" Dockerfile.${docker_arch}
fi
done
里边主要是替换Dockerfile可能跟架构有关的地方,比如FROM __BASEIMAGE_ARCH__/alpine:3.7 这里__BASEIMAGE_ARCH__这个就是我们需要替换的地方,我们可以根据CPU架构替换成amd64或者ppc64le等。
然后我们就可以根据架构的不一样分别build和打上不同的tag
for arch in amd64 arm32v6 arm64v8; do
docker build -f Dockerfile.${arch} -t yourrepo/nginx:${arch}-latest .
docker push yourrepo/nginx:${arch}-latest
done
最后我们可以使用上文中提到的方式,可以使用docker manifest方式创建指向不同CPU架构镜像的manifests list对象并将它push到docker hub