前言
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