前言
Docker image 存储设计之初,没有充分考虑到镜像Multi architecture的支持,而是简单的使用镜像存储库的前缀来区分相同应用的不同平台,并建议开发者将不同平台的镜像应该push到相对应的Docker hub的镜像仓库中,目前这种设计依旧保存在最新的Docker设计文档中:
https://github.com/docker-library/official-images#architectures-other-than-amd64
我们可以基于镜像存储库的前缀,或者是基于tag或image名称后缀来区分不同的运行平台来pull相应的Docker镜像,例如:
manifest相关命令
查看一个镜像的manifest文件信息
$docker manifest inspect java
查看一个镜像的manifest文件的详细信息包括cpu平台架构等信息
$docker manifest inspect --verbose java
使用manifest创建多CPU架构的镜像
1)实现一个 arm或者amd64 平台都可以执行的main.go脚本(略
2)构建镜像
虽然我们要实现 “多架构” 构建,但我们首先构建这两个架构的image。以下是它们的Dockerfile文件
不同的架构需要修改GOARCH
(1)构建第一个arm架构的镜像,并推送到dockerhub中
$ docker build -t blackdob/test-arch:v1-arm -f ./build/Dockerfile .
$ docker push blackdob/test-arch:v1-arm
(2)构建第一个amd64架构的镜像,并推送到dockerhub中(需要更改GOARCH=amd64)
$ docker build -t blackdob/test-arch:v1-amd64 -f ./build/Dockerfile .
$ docker push blackdob/test-arch:v1-amd64
3)查看 Experimental 是否已开启
docker version
3) 创建一个manifest list列表
创建一个自定义命名的镜像名的manifest list,然后用该列表关联仓库里面的两个不同架构的镜像
$ docker manifest create --insecure blackdob/test-arch:v1 blackdob/test-arch:v1-amd64 blackdob/test-arch:v1-arm
⚠️ 此时存在的问题是两个镜像的架构都是amd64, 我们需要将对应的镜像手动使用annotate更改为arm
$ docker manifest annotate blackdob/test-arch:v1 blackdob/test-arch:v1-arm --arch arm
此时再查看就没问题了
4) 将创建好的manifest list 推到仓库中:
$ docker manifest push -p --insecure blackdob/test-arch:v1
-p : 创建的MANIFEST_LIST会保存在本地目录~/.docker/manifests,在push时可以使用-p(--purge)参数删除本地数据
4)、查看仓库中创建好的manifest list:
$ docker manifest inspect blackdob/testarch:v1