如何构建多架构(Multi-Arch)的容器镜像(二)

          在构建多架构(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

你可能感兴趣的:(如何构建多架构(Multi-Arch)的容器镜像(二))