Skip to content

docker manifest调研

Hang Jiang edited this page Dec 9, 2018 · 1 revision

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的创建时机。

我目前初步考虑的可能的实现方案:

  1. 统一多种架构的CI环境

    1. 新版本的drone(1.0版本,目前是1.0-rc2)支持多种架构的agent部署在同一个drone server中。这样drone可以驱动多架构的ci流程,并且drone可以配置在所有架构的image push结束后再进行manifest list的create和push。

      • drone的1.0也刚刚rc2,不适合用在生产环境。
      • 需要目前的drone server完全迁移到新版本。
    2. 使用QEMU在x86环境下模拟arm64环境进行arm64的CI,这样就能将x86和arm64的CI跑在同一个环境中,通过drone的配置来控制在所有架构的image push结束后再进行manifest list的create和push。

      • 该方案需要测试具体的可行性以及性能如何。
  2. x86和arm64的CI还是在各自的环境中去运行。通过编写一个cli工具来避免docker manifest目前的限制。

    • 编写一个cli工具来实现向docker hub中已有的manifest list添加新架构的manifest的更新操作(基于目前的manifest cli功能去模拟)。这样就不需要去同步x86和arm64两种架构的CI流程。只需要各自在push镜像结束之后,通过编写的工具实现向manifest list中添加自己的image信息。
Clone this wiki locally