? ? ? ? ? 在構(gòu)建多架構(gòu)(Multi-Arch)的容器鏡像的時(shí)候聚至,如果我們使用的base鏡像已經(jīng)支持multi-arch的那么我們可以用一個(gè)dockerfile來(lái)build不同架構(gòu)的容器鏡像销部。比如jmeter的docker鏡像justb4/jmeter,它的dockerfile里base鏡像alpine:3.9捐寥,那么我們只需要在不同平臺(tái)的機(jī)器運(yùn)行docker build命令,然后按照上一節(jié)文章內(nèi)容制作出多架構(gòu)鏡像。
? ? ? ? ? 還有一種就是dockerfile里的base鏡像本身不是multi-arch的,那么我們需要采用另外一種辦法.使用一個(gè)Dockerfile模板鸿染,可以命名為 Dockerfile.cross
里邊的內(nèi)容可以象下面那樣
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;"]
然后用一個(gè)簡(jiǎn)短的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可能跟架構(gòu)有關(guān)的地方,比如FROM __BASEIMAGE_ARCH__/alpine:3.7 這里__BASEIMAGE_ARCH__這個(gè)就是我們需要替換的地方乞巧,我們可以根據(jù)CPU架構(gòu)替換成amd64或者ppc64le等涨椒。
然后我們就可以根據(jù)架構(gòu)的不一樣分別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方式創(chuàng)建指向不同CPU架構(gòu)鏡像的manifests list對(duì)象并將它push到docker hub