-
Notifications
You must be signed in to change notification settings - Fork 0
docker manifest调研
docker manifest的cli目前有如下四个子命令:
-
create:在本地创建一个manifest list信息,指定manifest list中都指向哪些image。创建后的manifest list只保存在本地。
- --amend参数只能向本地的manifest list中添加manifest信息,如果本地不存在对应的manifest list,则在本地创建一个新的manifest list。
-
inspect:从docker hub获取image的manifest信息。image必须push到docker hub后才能通过该命令获取到。
-
annotate: 为本地的manifest list中manifest添加架构和系统信息,只对本地的manifest list生效。
-
push: 把本地的manifest list信息推送到docker hub。
- -p参数可以在push的同时删除本地的manifest list。
Example
docker manifest create jianghang8421/manifest:v0.1.0 \
jianghang8421/manifest-amd64v0.1.0 \ #该镜像必须已上传到docker hub
jianghang8421/manifest-arm64:v0.1.0 #该镜像必须已上传到docker hub
docker manifest push -p jianghang8421/manifest:v0.1.0 # -p 为将manifest list推送到docker hub同时删除本地manifest list
docker manifest cli主要有如下限制:
-
manifest的cli目前不支持向docker hub中manifest list附加manifest的更新操作,只能重新创建manifest list然后push到docker hub覆盖原有的manifest list。
-
manifest list 在创建时必须从docker hub中获取所有架构的镜像的manifest信息,这就要求所有架构的镜像都必须已经push到docker hub才可以。 结合rancher目前的CI环境,由于x86的CI和arm64的CI是在不同的环境中运行,所以很难去同步两个环境的镜像build和push进程,这样导致很难去处理manifest list的创建时机。
我目前初步考虑的可能的实现方案:
-
统一多种架构的CI环境
-
新版本的drone(1.0版本,目前是1.0-rc2)支持多种架构的agent部署在同一个drone server中。这样drone可以驱动多架构的ci流程,并且drone可以配置在所有架构的image push结束后再进行manifest list的create和push。
- drone的1.0也刚刚rc2,不适合用在生产环境。
- 需要目前的drone server完全迁移到新版本。
-
使用QEMU在x86环境下模拟arm64环境进行arm64的CI,这样就能将x86和arm64的CI跑在同一个环境中,通过drone的配置来控制在所有架构的image push结束后再进行manifest list的create和push。
- 该方案需要测试具体的可行性以及性能如何。
-
-
x86和arm64的CI还是在各自的环境中去运行。通过编写一个cli工具来避免docker manifest目前的限制。
- 编写一个cli工具来实现向docker hub中已有的manifest list添加新架构的manifest的更新操作(基于目前的manifest cli功能去模拟)。这样就不需要去同步x86和arm64两种架构的CI流程。只需要各自在push镜像结束之后,通过编写的工具实现向manifest list中添加自己的image信息。