您將花費1~3min瀏覽完這篇文章~
我在研究多個鏡像之間的文件層合併時,意識到我們並不需要拖拽整個鏡像來標記鏡像,用Docker Registry API也可以完成。下面,我為大家詳細介紹。
理解Docker鏡像倉庫APIDocker 鏡像由多個問價層組成,每個文件層都作為一個通用規則由 Dockerfile 中的命令創建,每一條命令都給鏡像添加一個新的文件層。
從 Docker 鏡像倉庫 API 的角度來看,一個鏡像包含三種類型的數據:
在Docker鏡像倉庫的專門術語中,存儲庫存儲名稱相同但標記不同的所有鏡像的文件層和鏡像配置。例如:docker:18.06和docker:stable-dind來自同一個存儲庫,但是library/docker-dev中的所有圖像都在後者中。注意,存儲庫中的鏡像可能完全不同(例如:docker:18.06和docker:stable-dind)。
鏡像列表羅列所有層的blob和鏡像配置,只有鏡像列表可以儲存在標記名稱下。因此,為了一個標記,下載一個鏡像列表,然後為了另一個標記,再上傳這個鏡像列表;其效果與運行docker pull,接著docker tag,最後docker push相同。使用這個API的好處是:不需要下載鏡像(鏡像顯示的大小只有幾kb)從而大大加快標記速度。
使用curl進行遠程標記使用curl進行遠程標記可以通過兩個調用實現:
#!/bin/bash
REGISTRY_NAME="http://localhost:5000"
REPOSITORY=rd/dind
TAG_OLD=25
TAG_NEW=stable
CONTENT_TYPE="application/vnd.docker.distribution.manifest.v2+json"
MANIFEST=$(curl -H "Accept: ${CONTENT_TYPE}" "${REGISTRY_NAME}/v2/${REPOSITORY}/manifests/${TAG_OLD}")
curl -X PUT -H "Content-Type: ${CONTENT_TYPE}" -d "${MANIFEST}" "${REGISTRY_NAME}/v2/${REPOSITORY}/manifests/${TAG_NEW}"
注意,上述解決方案中沒有執行任何類型的身份驗證。對於基本身份驗證,首先使用-u "<user>:<pass>"為Docker Hub應用獲取令牌,然後再用-H "Authorization: Bearer <token>"。
使用PowerShell進行遠程標記 在我之前的一篇文章中,我宣布了一個新的PowerShell 模塊 ,用於將多個鏡像中的層合併到一個新鏡像中。我已經添加了一個新的cmdlet叫做Copy-DockerImage 標記鏡像在版本0.7.5.6:直接對應的註冊表。
Install-Module -Name DockerRegistry -MinimumVersion 0.7
$Params = @{
Registry = 'http://localhost:5000'
SourceRepository = 'test'
SourceTag = '25'
DestinationRepository = 'test2'
DestinationTag = 'stable'
}
Copy-DockerImage @Params 因為cmdlet還支持以新名稱存儲鏡像,所以它比使用curl的變體稍微複雜一些。上面的命令不僅添加了一個新標籤(25 –> stable),還將圖像存儲在一個新名稱下test –> test2)。
注意,用於Docker 鏡像倉庫API的PowerShell cmdlet支持多種類型的身份驗證。
點擊閱讀原文查看英文原文~