Docker pull แƒ“แƒ docker push แƒ‘แƒ แƒซแƒแƒœแƒ”แƒ‘แƒ”แƒ‘แƒ˜แƒก แƒ’แƒแƒœแƒฎแƒแƒ แƒชแƒ˜แƒ”แƒšแƒ”แƒ‘แƒ แƒ“แƒแƒ™แƒ”แƒ  แƒ™แƒšแƒ˜แƒ”แƒœแƒขแƒ˜แƒก แƒ’แƒแƒ แƒ”แƒจแƒ” HTTP แƒ›แƒแƒ—แƒฎแƒแƒ•แƒœแƒ”แƒ‘แƒ˜แƒก แƒ’แƒแƒ›แƒแƒงแƒ”แƒœแƒ”แƒ‘แƒ˜แƒ—

แƒฉแƒ•แƒ”แƒœ แƒ’แƒ•แƒฅแƒแƒœแƒ“แƒ 2 แƒขแƒแƒ›แƒแƒ แƒ แƒ‘แƒแƒšแƒแƒฎแƒ˜, 75 แƒ›แƒ”แƒกแƒ™แƒแƒšแƒ˜แƒœแƒ˜แƒก แƒขแƒแƒ‘แƒšแƒ”แƒขแƒ˜ unix แƒ’แƒแƒ แƒ”แƒ›แƒ, แƒ“แƒแƒ™แƒ”แƒ แƒ˜แƒก แƒกแƒแƒชแƒแƒ•แƒ˜ แƒ“แƒ แƒ“แƒแƒ™แƒ”แƒ แƒ˜แƒก แƒ–แƒ˜แƒ“แƒ•แƒ˜แƒกแƒ แƒ“แƒ แƒ“แƒแƒ™แƒ”แƒ  แƒžแƒฃแƒจแƒ˜แƒก แƒ‘แƒ แƒซแƒแƒœแƒ”แƒ‘แƒ”แƒ‘แƒ˜แƒก แƒ’แƒแƒœแƒฎแƒแƒ แƒชแƒ˜แƒ”แƒšแƒ”แƒ‘แƒ˜แƒก แƒ“แƒแƒ•แƒแƒšแƒ”แƒ‘แƒ แƒ“แƒแƒ™แƒ”แƒ  แƒ™แƒšแƒ˜แƒ”แƒœแƒขแƒ˜แƒก แƒ’แƒแƒ แƒ”แƒจแƒ”.

Docker pull แƒ“แƒ docker push แƒ‘แƒ แƒซแƒแƒœแƒ”แƒ‘แƒ”แƒ‘แƒ˜แƒก แƒ’แƒแƒœแƒฎแƒแƒ แƒชแƒ˜แƒ”แƒšแƒ”แƒ‘แƒ แƒ“แƒแƒ™แƒ”แƒ  แƒ™แƒšแƒ˜แƒ”แƒœแƒขแƒ˜แƒก แƒ’แƒแƒ แƒ”แƒจแƒ” HTTP แƒ›แƒแƒ—แƒฎแƒแƒ•แƒœแƒ”แƒ‘แƒ˜แƒก แƒ’แƒแƒ›แƒแƒงแƒ”แƒœแƒ”แƒ‘แƒ˜แƒ—

UPD:
แƒ™แƒ˜แƒ—แƒฎแƒ•แƒ: แƒ แƒ˜แƒกแƒ—แƒ•แƒ˜แƒก แƒแƒ แƒ˜แƒก แƒ”แƒก แƒงแƒ•แƒ”แƒšแƒแƒคแƒ”แƒ แƒ˜?
แƒžแƒแƒกแƒฃแƒฎแƒ˜: แƒžแƒ แƒแƒ“แƒฃแƒฅแƒขแƒ˜แƒก แƒ“แƒแƒขแƒ•แƒ˜แƒ แƒ—แƒ•แƒ˜แƒก แƒขแƒ”แƒกแƒขแƒ˜แƒ แƒ”แƒ‘แƒ (แƒแƒ  แƒ’แƒแƒ›แƒแƒ˜แƒงแƒ”แƒœแƒ”แƒ‘แƒ bash, แƒกแƒ™แƒ แƒ˜แƒžแƒขแƒ”แƒ‘แƒ˜ แƒ›แƒแƒฌแƒแƒ“แƒ”แƒ‘แƒฃแƒšแƒ˜แƒ แƒกแƒแƒ’แƒแƒœแƒ›แƒแƒœแƒแƒ—แƒšแƒ”แƒ‘แƒšแƒ แƒ›แƒ˜แƒ–แƒœแƒ”แƒ‘แƒ˜แƒกแƒ—แƒ•แƒ˜แƒก). แƒ’แƒแƒ“แƒแƒฌแƒงแƒ“แƒ, แƒ แƒแƒ› แƒแƒ  แƒ’แƒแƒ›แƒแƒ”แƒงแƒ”แƒœแƒ”แƒ‘แƒ˜แƒœแƒ แƒ“แƒแƒ™แƒ”แƒ  แƒ™แƒšแƒ˜แƒ”แƒœแƒขแƒ˜ แƒ“แƒแƒ›แƒแƒขแƒ”แƒ‘แƒ˜แƒ—แƒ˜ แƒคแƒ”แƒœแƒ”แƒ‘แƒ˜แƒก แƒจแƒ”แƒกแƒแƒ›แƒชแƒ˜แƒ แƒ”แƒ‘แƒšแƒแƒ“ (แƒ’แƒแƒœแƒ˜แƒ•แƒ แƒฃแƒšแƒ˜ แƒšแƒ˜แƒ›แƒ˜แƒขแƒ”แƒ‘แƒ˜แƒก แƒคแƒแƒ แƒ’แƒšแƒ”แƒ‘แƒจแƒ˜) แƒ“แƒ, แƒจแƒ”แƒกแƒแƒ‘แƒแƒ›แƒ˜แƒกแƒแƒ“, แƒฃแƒคแƒ แƒ แƒ›แƒแƒฆแƒแƒšแƒ˜ แƒ“แƒแƒขแƒ•แƒ˜แƒ แƒ—แƒ•แƒ˜แƒก แƒ”แƒ›แƒฃแƒšแƒแƒชแƒ˜แƒ. แƒจแƒ”แƒ“แƒ”แƒ’แƒแƒ“, Docker แƒ™แƒšแƒ˜แƒ”แƒœแƒขแƒ˜แƒก แƒกแƒ˜แƒกแƒขแƒ”แƒ›แƒ˜แƒก แƒงแƒ•แƒ”แƒšแƒ แƒจแƒ”แƒคแƒ”แƒ แƒฎแƒ”แƒ‘แƒ แƒ›แƒแƒ˜แƒฎแƒกแƒœแƒ. แƒจแƒ”แƒ“แƒแƒ แƒ”แƒ‘แƒ˜แƒ— แƒกแƒฃแƒคแƒ—แƒ แƒ“แƒแƒขแƒ•แƒ˜แƒ แƒ—แƒ•แƒ แƒ›แƒ˜แƒ•แƒ˜แƒฆแƒ”แƒ— แƒžแƒ˜แƒ แƒ“แƒแƒžแƒ˜แƒ  แƒžแƒ แƒแƒ“แƒฃแƒฅแƒขแƒ–แƒ”.
แƒกแƒขแƒแƒขแƒ˜แƒแƒจแƒ˜ แƒ’แƒแƒ›แƒแƒงแƒ”แƒœแƒ”แƒ‘แƒฃแƒšแƒ˜ แƒ˜แƒงแƒ แƒ˜แƒœแƒกแƒขแƒ แƒฃแƒ›แƒ”แƒœแƒขแƒ”แƒ‘แƒ˜แƒก GNU แƒ•แƒ”แƒ แƒกแƒ˜แƒ”แƒ‘แƒ˜.

แƒžแƒ˜แƒ แƒ•แƒ”แƒšแƒ˜, แƒ›แƒแƒ“แƒ˜แƒ— แƒ’แƒแƒ”แƒ แƒ™แƒ•แƒœแƒ”แƒœ, แƒ แƒแƒก แƒแƒ™แƒ”แƒ—แƒ”แƒ‘แƒ”แƒœ แƒ”แƒก แƒ‘แƒ แƒซแƒแƒœแƒ”แƒ‘แƒ”แƒ‘แƒ˜.

แƒ›แƒแƒจ, แƒ แƒ˜แƒกแƒ—แƒ•แƒ˜แƒก แƒ’แƒแƒ›แƒแƒ˜แƒงแƒ”แƒœแƒ”แƒ‘แƒ docker pull? แฒ›แƒ˜แƒฎแƒ”แƒ“แƒ•แƒ˜แƒ— แƒ“แƒแƒ™แƒฃแƒ›แƒ”แƒœแƒขแƒแƒชแƒ˜แƒ:

"แƒ’แƒแƒ›แƒแƒ˜แƒฆแƒ”แƒ— แƒกแƒฃแƒ แƒแƒ—แƒ˜ แƒแƒœ แƒกแƒแƒชแƒแƒ•แƒ˜ แƒ แƒ”แƒ”แƒกแƒขแƒ แƒ˜แƒ“แƒแƒœ".

แƒ˜แƒฅ แƒฉแƒ•แƒ”แƒœ แƒแƒกแƒ”แƒ•แƒ” แƒ•แƒžแƒแƒฃแƒšแƒแƒ‘แƒ— แƒ‘แƒ›แƒฃแƒšแƒก แƒกแƒฃแƒ แƒแƒ—แƒ”แƒ‘แƒ˜แƒก, แƒ™แƒแƒœแƒขแƒ”แƒ˜แƒœแƒ”แƒ แƒ”แƒ‘แƒ˜แƒก แƒ“แƒ แƒจแƒ”แƒœแƒแƒฎแƒ•แƒ˜แƒก แƒ“แƒ แƒแƒ˜แƒ•แƒ”แƒ แƒ”แƒ‘แƒ˜แƒก แƒ’แƒแƒ’แƒ”แƒ‘แƒ.

Docker pull แƒ“แƒ docker push แƒ‘แƒ แƒซแƒแƒœแƒ”แƒ‘แƒ”แƒ‘แƒ˜แƒก แƒ’แƒแƒœแƒฎแƒแƒ แƒชแƒ˜แƒ”แƒšแƒ”แƒ‘แƒ แƒ“แƒแƒ™แƒ”แƒ  แƒ™แƒšแƒ˜แƒ”แƒœแƒขแƒ˜แƒก แƒ’แƒแƒ แƒ”แƒจแƒ” HTTP แƒ›แƒแƒ—แƒฎแƒแƒ•แƒœแƒ”แƒ‘แƒ˜แƒก แƒ’แƒแƒ›แƒแƒงแƒ”แƒœแƒ”แƒ‘แƒ˜แƒ—

แƒแƒฅแƒ”แƒ“แƒแƒœ แƒจแƒ”แƒ’แƒ•แƒ˜แƒซแƒšแƒ˜แƒ แƒ’แƒแƒ•แƒ˜แƒ’แƒแƒ—, แƒ แƒแƒ› แƒ“แƒแƒ™แƒ”แƒ แƒ˜แƒก แƒ’แƒแƒ›แƒแƒกแƒแƒฎแƒฃแƒšแƒ”แƒ‘แƒ แƒแƒ แƒ˜แƒก แƒ’แƒแƒ แƒ™แƒ•แƒ”แƒฃแƒšแƒ˜ แƒคแƒ”แƒœแƒ”แƒ‘แƒ˜แƒก แƒœแƒแƒ™แƒ แƒ”แƒ‘แƒ˜, แƒ แƒแƒ›แƒ”แƒšแƒ˜แƒช แƒจแƒ”แƒ˜แƒชแƒแƒ•แƒก แƒ˜แƒœแƒคแƒแƒ แƒ›แƒแƒชแƒ˜แƒแƒก แƒ’แƒแƒ›แƒแƒกแƒแƒฎแƒฃแƒšแƒ”แƒ‘แƒ˜แƒก แƒฃแƒแƒฎแƒšแƒ”แƒกแƒ˜ แƒชแƒ•แƒšแƒ˜แƒšแƒ”แƒ‘แƒ”แƒ‘แƒ˜แƒก แƒจแƒ”แƒกแƒแƒฎแƒ”แƒ‘, แƒ แƒแƒช แƒแƒจแƒ™แƒแƒ แƒแƒ“ แƒ’แƒ•แƒญแƒ˜แƒ แƒ“แƒ”แƒ‘แƒ. แƒจแƒ”แƒ›แƒ“แƒ”แƒ’ แƒฉแƒ•แƒ”แƒœ แƒ•แƒฃแƒงแƒฃแƒ แƒ”แƒ‘แƒ— แƒ แƒ”แƒ”แƒกแƒขแƒ แƒ˜แƒก API.

แƒ›แƒแƒกแƒจแƒ˜ แƒœแƒแƒ—แƒฅแƒ•แƒแƒ›แƒ˜แƒ แƒจแƒ”แƒ›แƒ“แƒ”แƒ’แƒ˜:

"แƒกแƒฃแƒ แƒแƒ—แƒ˜" แƒแƒ แƒ˜แƒก JSON แƒ›แƒแƒœแƒ˜แƒคแƒ”แƒกแƒขแƒ˜แƒก แƒ“แƒ แƒชแƒแƒšแƒ™แƒ”แƒฃแƒšแƒ˜ แƒคแƒ”แƒœแƒ˜แƒก แƒคแƒแƒ˜แƒšแƒ”แƒ‘แƒ˜แƒก แƒ™แƒแƒ›แƒ‘แƒ˜แƒœแƒแƒชแƒ˜แƒ. > แƒกแƒฃแƒ แƒแƒ—แƒ˜แƒก แƒแƒ›แƒแƒฆแƒ”แƒ‘แƒ˜แƒก แƒžแƒ แƒแƒชแƒ”แƒกแƒ˜ แƒแƒ แƒ˜แƒ”แƒœแƒขแƒ˜แƒ แƒ”แƒ‘แƒฃแƒšแƒ˜แƒ แƒแƒ› แƒแƒ แƒ˜ แƒ™แƒแƒ›แƒžแƒแƒœแƒ”แƒœแƒขแƒ˜แƒก แƒ›แƒแƒซแƒ˜แƒ”แƒ‘แƒแƒ–แƒ”."

แƒแƒกแƒ” แƒ แƒแƒ›, แƒžแƒ˜แƒ แƒ•แƒ”แƒšแƒ˜ แƒœแƒแƒ‘แƒ˜แƒฏแƒ˜ แƒ“แƒแƒ™แƒฃแƒ›แƒ”แƒœแƒขแƒแƒชแƒ˜แƒ˜แƒก แƒ›แƒ˜แƒฎแƒ”แƒ“แƒ•แƒ˜แƒ— แƒแƒ แƒ˜แƒก โ€แƒ’แƒแƒ›แƒแƒกแƒแƒฎแƒฃแƒšแƒ”แƒ‘แƒ˜แƒก แƒ›แƒแƒœแƒ˜แƒคแƒ”แƒกแƒขแƒ˜แƒก แƒ’แƒแƒงแƒ•แƒแƒœแƒ".

แƒ แƒ แƒ—แƒฅแƒ›แƒ แƒฃแƒœแƒ“แƒ, แƒฉแƒ•แƒ”แƒœ แƒแƒ  แƒ’แƒแƒ“แƒแƒ•แƒ˜แƒฆแƒ”แƒ‘แƒ— แƒ›แƒแƒก, แƒ›แƒแƒ’แƒ แƒแƒ› แƒฉแƒ•แƒ”แƒœ แƒ’แƒ•แƒญแƒ˜แƒ แƒ“แƒ”แƒ‘แƒ แƒ›แƒแƒœแƒแƒชแƒ”แƒ›แƒ”แƒ‘แƒ˜. แƒจแƒ”แƒ›แƒ“แƒ”แƒ’แƒ˜ แƒแƒ แƒ˜แƒก แƒ›แƒแƒ—แƒฎแƒแƒ•แƒœแƒ˜แƒก แƒ›แƒแƒ’แƒแƒšแƒ˜แƒ—แƒ˜: GET /v2/{name}/manifests/{reference}

"แƒกแƒแƒฎแƒ”แƒšแƒ˜ แƒ“แƒ แƒ›แƒ˜แƒ—แƒ˜แƒ—แƒ”แƒ‘แƒ˜แƒก แƒžแƒแƒ แƒแƒ›แƒ”แƒขแƒ แƒ˜ แƒ˜แƒ“แƒ”แƒœแƒขแƒ˜แƒคแƒ˜แƒชแƒ˜แƒ แƒ”แƒ‘แƒก แƒกแƒฃแƒ แƒแƒ—แƒก แƒ“แƒ แƒแƒฃแƒชแƒ˜แƒšแƒ”แƒ‘แƒ”แƒšแƒ˜แƒ. แƒ›แƒ˜แƒ—แƒ˜แƒ—แƒ”แƒ‘แƒ แƒจแƒ”แƒ˜แƒซแƒšแƒ”แƒ‘แƒ แƒจแƒ”แƒ˜แƒชแƒแƒ•แƒ“แƒ”แƒก แƒขแƒ”แƒ’แƒก แƒแƒœ แƒ“แƒแƒ˜แƒฏแƒ”แƒกแƒขแƒก."

แƒฉแƒ•แƒ”แƒœแƒ˜ แƒ“แƒแƒ™แƒ”แƒ แƒ˜แƒก แƒกแƒแƒชแƒแƒ•แƒ˜ แƒ’แƒแƒœแƒšแƒแƒ’แƒ”แƒ‘แƒฃแƒšแƒ˜แƒ แƒแƒ“แƒ’แƒ˜แƒšแƒแƒ‘แƒ แƒ˜แƒ•แƒแƒ“, แƒจแƒ”แƒ•แƒ”แƒชแƒแƒ“แƒแƒ— แƒจแƒ”แƒแƒกแƒ แƒฃแƒšแƒแƒ— แƒ›แƒแƒ—แƒฎแƒแƒ•แƒœแƒ:

curl -s -X GET "http://localhost:8081/link/to/docker/registry/v2/centos-11-10/manifests/1.1.1" -H "header_if_needed"

Docker pull แƒ“แƒ docker push แƒ‘แƒ แƒซแƒแƒœแƒ”แƒ‘แƒ”แƒ‘แƒ˜แƒก แƒ’แƒแƒœแƒฎแƒแƒ แƒชแƒ˜แƒ”แƒšแƒ”แƒ‘แƒ แƒ“แƒแƒ™แƒ”แƒ  แƒ™แƒšแƒ˜แƒ”แƒœแƒขแƒ˜แƒก แƒ’แƒแƒ แƒ”แƒจแƒ” HTTP แƒ›แƒแƒ—แƒฎแƒแƒ•แƒœแƒ”แƒ‘แƒ˜แƒก แƒ’แƒแƒ›แƒแƒงแƒ”แƒœแƒ”แƒ‘แƒ˜แƒ—

แƒแƒ›แƒ˜แƒก แƒกแƒแƒžแƒแƒกแƒฃแƒฎแƒแƒ“, แƒฉแƒ•แƒ”แƒœ แƒ•แƒ˜แƒฆแƒ”แƒ‘แƒ— json-แƒก, แƒกแƒแƒ˜แƒ“แƒแƒœแƒแƒช แƒแƒ›แƒŸแƒแƒ›แƒแƒ“ แƒ›แƒฎแƒแƒšแƒแƒ“ แƒกแƒ˜แƒชแƒแƒชแƒฎแƒšแƒ˜แƒก แƒฎแƒแƒ–แƒ˜ แƒ’แƒ•แƒแƒ˜แƒœแƒขแƒ”แƒ แƒ”แƒกแƒ”แƒ‘แƒก, แƒฃแƒคแƒ แƒ แƒกแƒฌแƒแƒ แƒแƒ“ แƒ›แƒแƒ—แƒ˜ แƒฐแƒ”แƒจแƒ”แƒ‘แƒ˜. แƒ›แƒแƒ—แƒ˜ แƒ›แƒ˜แƒฆแƒ”แƒ‘แƒ˜แƒก แƒจแƒ”แƒ›แƒ“แƒ”แƒ’, แƒฉแƒ•แƒ”แƒœ แƒจแƒ”แƒ’แƒ•แƒ˜แƒซแƒšแƒ˜แƒ แƒ’แƒแƒ“แƒแƒ•แƒฎแƒ”แƒ“แƒแƒ— แƒ—แƒ˜แƒ—แƒแƒ”แƒฃแƒšแƒก แƒ“แƒ แƒจแƒ”แƒ•แƒแƒกแƒ แƒฃแƒšแƒแƒ— แƒจแƒ”แƒ›แƒ“แƒ”แƒ’แƒ˜ แƒ›แƒแƒ—แƒฎแƒแƒ•แƒœแƒ: "GET /v2/{name}/blobs/{digest}"

โ€žแƒคแƒ”แƒœแƒแƒ–แƒ” แƒฌแƒ•แƒ“แƒแƒ›แƒ แƒจแƒ”แƒ˜แƒ–แƒฆแƒฃแƒ“แƒ”แƒ‘แƒ แƒกแƒแƒชแƒแƒ•แƒ˜แƒก แƒกแƒแƒฎแƒ”แƒšแƒ˜แƒ—, แƒ›แƒแƒ’แƒ แƒแƒ› แƒ แƒ”แƒ”แƒกแƒขแƒ แƒจแƒ˜ แƒชแƒแƒšแƒกแƒแƒฎแƒแƒ“ แƒ˜แƒ“แƒ”แƒœแƒขแƒ˜แƒคแƒ˜แƒชแƒ˜แƒ แƒ”แƒ‘แƒฃแƒšแƒ˜แƒ แƒ“แƒแƒ˜แƒฏแƒ”แƒกแƒขแƒ˜แƒก แƒ›แƒ˜แƒฎแƒ”แƒ“แƒ•แƒ˜แƒ—โ€œ.

แƒ“แƒแƒ˜แƒฏแƒ”แƒกแƒขแƒ˜ แƒแƒ› แƒจแƒ”แƒ›แƒ—แƒฎแƒ•แƒ”แƒ•แƒแƒจแƒ˜ แƒแƒ แƒ˜แƒก แƒฐแƒ”แƒจแƒ˜, แƒ แƒแƒ›แƒ”แƒšแƒ˜แƒช แƒ›แƒ˜แƒ•แƒ˜แƒฆแƒ”แƒ—.

แƒชแƒ“แƒ˜แƒšแƒแƒ‘แƒก

curl -s -X GET "http://localhost:8081/link/to/docker/registry/v2/centos-11-10/blobs/sha256:f972d139738dfcd1519fd2461815651336ee25a8b54c358834c50af094bb262f" -H "header_if_needed" --output firstLayer

Docker pull แƒ“แƒ docker push แƒ‘แƒ แƒซแƒแƒœแƒ”แƒ‘แƒ”แƒ‘แƒ˜แƒก แƒ’แƒแƒœแƒฎแƒแƒ แƒชแƒ˜แƒ”แƒšแƒ”แƒ‘แƒ แƒ“แƒแƒ™แƒ”แƒ  แƒ™แƒšแƒ˜แƒ”แƒœแƒขแƒ˜แƒก แƒ’แƒแƒ แƒ”แƒจแƒ” HTTP แƒ›แƒแƒ—แƒฎแƒแƒ•แƒœแƒ”แƒ‘แƒ˜แƒก แƒ’แƒแƒ›แƒแƒงแƒ”แƒœแƒ”แƒ‘แƒ˜แƒ—

แƒ•แƒœแƒแƒฎแƒแƒ—, แƒกแƒแƒ‘แƒแƒšแƒแƒแƒ“ แƒ แƒแƒ’แƒแƒ แƒ˜ แƒคแƒแƒ˜แƒšแƒ˜ แƒ›แƒ˜แƒ•แƒ˜แƒฆแƒ”แƒ—, แƒ แƒแƒ’แƒแƒ แƒช แƒžแƒ˜แƒ แƒ•แƒ”แƒšแƒ˜ แƒ›แƒแƒจแƒ•แƒ”แƒšแƒ˜.

file firstLayer

Docker pull แƒ“แƒ docker push แƒ‘แƒ แƒซแƒแƒœแƒ”แƒ‘แƒ”แƒ‘แƒ˜แƒก แƒ’แƒแƒœแƒฎแƒแƒ แƒชแƒ˜แƒ”แƒšแƒ”แƒ‘แƒ แƒ“แƒแƒ™แƒ”แƒ  แƒ™แƒšแƒ˜แƒ”แƒœแƒขแƒ˜แƒก แƒ’แƒแƒ แƒ”แƒจแƒ” HTTP แƒ›แƒแƒ—แƒฎแƒแƒ•แƒœแƒ”แƒ‘แƒ˜แƒก แƒ’แƒแƒ›แƒแƒงแƒ”แƒœแƒ”แƒ‘แƒ˜แƒ—

แƒ˜แƒ›แƒแƒ—. แƒ แƒ”แƒšแƒกแƒ”แƒ‘แƒ˜ แƒแƒ แƒ˜แƒก แƒขแƒแƒ แƒ˜แƒก แƒแƒ แƒฅแƒ˜แƒ•แƒ”แƒ‘แƒ˜, แƒ›แƒแƒ—แƒ˜ แƒจแƒ”แƒกแƒแƒ‘แƒแƒ›แƒ˜แƒกแƒ˜ แƒ—แƒแƒœแƒ›แƒ˜แƒ›แƒ“แƒ”แƒ•แƒ แƒแƒ‘แƒ˜แƒ— แƒ’แƒแƒฎแƒกแƒœแƒ˜แƒ— แƒ›แƒ˜แƒ•แƒ˜แƒฆแƒ”แƒ‘แƒ— แƒกแƒฃแƒ แƒแƒ—แƒ˜แƒก แƒจแƒ˜แƒœแƒแƒแƒ แƒกแƒก.

แƒ›แƒแƒ“แƒ˜แƒ— แƒ“แƒแƒ•แƒฌแƒ”แƒ แƒแƒ— แƒžแƒแƒขแƒแƒ แƒ แƒ‘แƒแƒจแƒ˜แƒก แƒกแƒ™แƒ แƒ˜แƒžแƒขแƒ˜, แƒ แƒแƒ—แƒ แƒ”แƒก แƒงแƒ•แƒ”แƒšแƒแƒคแƒ”แƒ แƒ˜ แƒแƒ•แƒขแƒแƒ›แƒแƒขแƒ˜แƒ–แƒ˜แƒ แƒ”แƒ‘แƒฃแƒšแƒ˜ แƒ˜แƒงแƒแƒก

#!/bin/bash -eu

downloadDir=$1
# url as http://localhost:8081/link/to/docker/registry
url=$2
imageName=$3
tag=$4

# array of layers
layers=($(curl -s -X GET "$url/v2/$imageName/manifests/$tag" | grep -oP '(?<=blobSum" : ").+(?=")'))

# download each layer from array
for layer in "${layers[@]}"; do
    echo "Downloading ${layer}"
    curl -v -X GET "$url/v2/$imageName/blobs/$layer" --output "$downloadDir/$layer.tar"
done

# find all layers, untar them and remove source .tar files
cd "$downloadDir" && find . -name "sha256:*" -exec tar xvf {} ;
rm sha256:*.tar
exit 0

แƒแƒฎแƒšแƒ แƒจแƒ”แƒ’แƒ•แƒ˜แƒซแƒšแƒ˜แƒ แƒ›แƒ˜แƒกแƒ˜ แƒ’แƒแƒจแƒ•แƒ”แƒ‘แƒ แƒกแƒแƒกแƒฃแƒ แƒ•แƒ”แƒšแƒ˜ แƒžแƒแƒ แƒแƒ›แƒ”แƒขแƒ แƒ”แƒ‘แƒ˜แƒ— แƒ“แƒ แƒ›แƒ˜แƒ•แƒ˜แƒฆแƒแƒ— แƒกแƒแƒญแƒ˜แƒ แƒ แƒกแƒฃแƒ แƒแƒ—แƒ˜แƒก แƒจแƒ˜แƒœแƒแƒแƒ แƒกแƒ˜

./script.sh dirName โ€œhttp://localhost:8081/link/to/docker/registryโ€ myAwesomeImage 1.0

แƒœแƒแƒฌแƒ˜แƒšแƒ˜ 2 - แƒ“แƒแƒ™แƒ”แƒ  แƒ‘แƒ˜แƒซแƒ’แƒ˜

แƒ”แƒก แƒชแƒแƒขแƒ แƒฃแƒคแƒ แƒ แƒ แƒ—แƒฃแƒšแƒ˜ แƒ˜แƒฅแƒœแƒ”แƒ‘แƒ.

แƒ“แƒแƒ•แƒ˜แƒฌแƒงแƒแƒ— แƒ—แƒแƒ•แƒ˜แƒ“แƒแƒœ แƒ“แƒแƒ™แƒฃแƒ›แƒ”แƒœแƒขแƒแƒชแƒ˜แƒ. แƒแƒ›แƒ˜แƒขแƒแƒ›, แƒฉแƒ•แƒ”แƒœ แƒฃแƒœแƒ“แƒ แƒ’แƒแƒ“แƒ›แƒแƒ•แƒฌแƒ”แƒ แƒแƒ— แƒ—แƒ˜แƒ—แƒแƒ”แƒฃแƒšแƒ˜ แƒšแƒ˜แƒ“แƒ”แƒ แƒ˜, แƒจแƒ”แƒ•แƒแƒ’แƒ แƒแƒ•แƒแƒ— แƒจแƒ”แƒกแƒแƒ‘แƒแƒ›แƒ˜แƒกแƒ˜ แƒ›แƒแƒœแƒ˜แƒคแƒ”แƒกแƒขแƒ˜ แƒ“แƒ แƒ˜แƒกแƒ˜แƒช แƒ’แƒแƒ“แƒ›แƒแƒ•แƒฌแƒ”แƒ แƒแƒ—. แƒ แƒแƒ’แƒแƒ แƒช แƒฉแƒแƒœแƒก แƒ›แƒแƒ แƒขแƒ˜แƒ•แƒ˜แƒ.

แƒ“แƒแƒ™แƒฃแƒ›แƒ”แƒœแƒขแƒแƒชแƒ˜แƒ˜แƒก แƒจแƒ”แƒกแƒฌแƒแƒ•แƒšแƒ˜แƒก แƒจแƒ”แƒ›แƒ“แƒ”แƒ’, แƒฉแƒแƒ›แƒแƒขแƒ•แƒ˜แƒ แƒ—แƒ•แƒ˜แƒก แƒžแƒ แƒแƒชแƒ”แƒกแƒ˜ แƒจแƒ”แƒ˜แƒซแƒšแƒ”แƒ‘แƒ แƒ“แƒแƒ•แƒงแƒแƒ— แƒ แƒแƒ›แƒ“แƒ”แƒœแƒ˜แƒ›แƒ” แƒ”แƒขแƒแƒžแƒแƒ“:

  • แƒžแƒ แƒแƒชแƒ”แƒกแƒ˜แƒก แƒ˜แƒœแƒ˜แƒชแƒ˜แƒแƒšแƒ˜แƒ–แƒแƒชแƒ˜แƒ - "POST /v2/{repoName}/blobs/uploads/"
  • แƒกแƒแƒ›แƒแƒจแƒ•แƒ”แƒšแƒ แƒฎแƒแƒ–แƒ˜แƒก แƒแƒขแƒ•แƒ˜แƒ แƒ—แƒ•แƒ (แƒฉแƒ•แƒ”แƒœ แƒ’แƒแƒ›แƒแƒ•แƒ˜แƒงแƒ”แƒœแƒ”แƒ‘แƒ— แƒ›แƒแƒœแƒแƒšแƒ˜แƒ—แƒฃแƒ  แƒแƒขแƒ•แƒ˜แƒ แƒ—แƒ•แƒแƒก, แƒแƒœแƒฃ แƒ•แƒแƒ’แƒ–แƒแƒ•แƒœแƒ˜แƒ— แƒ—แƒ˜แƒ—แƒแƒ”แƒฃแƒš แƒ›แƒแƒจแƒ•แƒ”แƒš แƒฎแƒแƒ–แƒก แƒ›แƒ—แƒšแƒ˜แƒแƒœแƒแƒ“) - "PUT /v2/{repoName}/blobs/uploads/{uuid}?digest={digest}
    แƒจแƒ˜แƒœแƒแƒแƒ แƒกแƒ˜-แƒกแƒ˜แƒ’แƒ แƒซแƒ”: {แƒคแƒ”แƒœแƒ˜แƒก แƒ–แƒแƒ›แƒ}
    แƒจแƒ˜แƒœแƒแƒแƒ แƒกแƒ˜-แƒขแƒ˜แƒžแƒ˜: แƒแƒžแƒšแƒ˜แƒ™แƒแƒชแƒ˜แƒ/แƒแƒฅแƒขแƒ”แƒขแƒ˜-แƒœแƒแƒ™แƒแƒ“แƒ˜
    แƒคแƒ”แƒœแƒ˜แƒก แƒแƒ แƒแƒ‘แƒ˜แƒ—แƒ˜ แƒ›แƒแƒœแƒแƒชแƒ”แƒ›แƒ”แƒ‘แƒ˜".
  • แƒ˜แƒขแƒ•แƒ˜แƒ แƒ—แƒ”แƒ‘แƒ manifest - "PUT /v2/{repoName}/manifests/{reference}".

แƒ›แƒแƒ’แƒ แƒแƒ› แƒ“แƒแƒ™แƒฃแƒ›แƒ”แƒœแƒขแƒแƒชแƒ˜แƒแƒก แƒ’แƒแƒ›แƒแƒขแƒแƒ•แƒ”แƒ‘แƒก แƒ”แƒ แƒ—แƒ˜ แƒœแƒแƒ‘แƒ˜แƒฏแƒ˜, แƒ แƒแƒ›แƒšแƒ˜แƒก แƒ’แƒแƒ แƒ”แƒจแƒ”แƒช แƒแƒ แƒแƒคแƒ”แƒ แƒ˜ แƒ˜แƒ›แƒฃแƒจแƒแƒ•แƒ”แƒ‘แƒก. แƒ›แƒแƒœแƒแƒšแƒ˜แƒ—แƒฃแƒ แƒ˜ แƒ“แƒแƒขแƒ•แƒ˜แƒ แƒ—แƒ•แƒ˜แƒกแƒ—แƒ•แƒ˜แƒก, แƒแƒกแƒ”แƒ•แƒ” แƒœแƒแƒฌแƒ˜แƒšแƒแƒ‘แƒ แƒ˜แƒ•แƒ˜ (แƒ“แƒแƒฅแƒฃแƒชแƒ›แƒแƒชแƒ”แƒ‘แƒฃแƒšแƒ˜), แƒšแƒ˜แƒแƒœแƒ“แƒแƒ’แƒ˜แƒก แƒฉแƒแƒขแƒ•แƒ˜แƒ แƒ—แƒ•แƒแƒ›แƒ“แƒ”, แƒ—แƒฅแƒ•แƒ”แƒœ แƒฃแƒœแƒ“แƒ แƒจแƒ”แƒแƒกแƒ แƒฃแƒšแƒแƒ— PATCH แƒ›แƒแƒ—แƒฎแƒแƒ•แƒœแƒ:

"PATCH /v2/{repoName}/blobs/uploads/{uuid}
แƒจแƒ˜แƒœแƒแƒแƒ แƒกแƒ˜-แƒกแƒ˜แƒ’แƒ แƒซแƒ”: {แƒœแƒแƒฌแƒ˜แƒšแƒ˜แƒก แƒ–แƒแƒ›แƒ}
แƒจแƒ˜แƒœแƒแƒแƒ แƒกแƒ˜-แƒขแƒ˜แƒžแƒ˜: แƒแƒžแƒšแƒ˜แƒ™แƒแƒชแƒ˜แƒ/แƒแƒฅแƒขแƒ”แƒขแƒ˜-แƒœแƒแƒ™แƒแƒ“แƒ˜
{Layer Chunk Binary Data}".

แƒฌแƒ˜แƒœแƒแƒแƒฆแƒ›แƒ“แƒ”แƒ’ แƒจแƒ”แƒ›แƒ—แƒฎแƒ•แƒ”แƒ•แƒแƒจแƒ˜, แƒžแƒ˜แƒ แƒ•แƒ”แƒš แƒžแƒฃแƒœแƒฅแƒขแƒก แƒ•แƒ”แƒ  แƒ’แƒแƒ“แƒแƒฎแƒ•แƒแƒšแƒ—, แƒ แƒแƒ“แƒ’แƒแƒœ... แƒ›แƒแƒกแƒแƒšแƒแƒ“แƒœแƒ”แƒšแƒ˜ แƒกแƒแƒžแƒแƒกแƒฃแƒฎแƒ แƒ™แƒแƒ“แƒ˜ 202-แƒ˜แƒก แƒœแƒแƒชแƒ•แƒšแƒแƒ“, แƒ—แƒฅแƒ•แƒ”แƒœ แƒ›แƒ˜แƒ˜แƒฆแƒ”แƒ‘แƒ— 4xx-แƒก.

แƒแƒฎแƒšแƒ แƒแƒšแƒ’แƒแƒ แƒ˜แƒ—แƒ›แƒ˜ แƒแƒกแƒ” แƒ’แƒแƒ›แƒแƒ˜แƒงแƒฃแƒ แƒ”แƒ‘แƒ:

  • แƒ˜แƒœแƒ˜แƒชแƒ˜แƒแƒšแƒ˜แƒ–แƒแƒชแƒ˜แƒ
  • แƒžแƒแƒขแƒฉแƒ˜ แƒกแƒแƒ แƒ™แƒ˜แƒœแƒ˜แƒ’แƒ–แƒ
  • แƒ›แƒแƒแƒฏแƒ˜แƒ แƒ˜แƒก แƒฉแƒแƒขแƒ•แƒ˜แƒ แƒ—แƒ•แƒ
  • แƒ›แƒแƒœแƒ˜แƒคแƒ”แƒกแƒขแƒ˜แƒก แƒฉแƒแƒขแƒ•แƒ˜แƒ แƒ—แƒ•แƒ
    2 แƒ“แƒ 3 แƒžแƒฃแƒœแƒฅแƒขแƒ”แƒ‘แƒ˜, แƒจแƒ”แƒกแƒแƒ‘แƒแƒ›แƒ˜แƒกแƒแƒ“, แƒ’แƒแƒœแƒ›แƒ”แƒแƒ แƒ“แƒ”แƒ‘แƒ แƒ˜แƒ›แƒ“แƒ”แƒœแƒฏแƒ”แƒ , แƒ แƒแƒ›แƒ“แƒ”แƒœแƒฏแƒ”แƒ แƒแƒช แƒกแƒแƒญแƒ˜แƒ แƒแƒ แƒฎแƒแƒ–แƒ”แƒ‘แƒ˜แƒก แƒฉแƒแƒขแƒ•แƒ˜แƒ แƒ—แƒ•แƒ.

แƒžแƒ˜แƒ แƒ•แƒ”แƒš แƒ แƒ˜แƒ’แƒจแƒ˜, แƒฉแƒ•แƒ”แƒœ แƒ’แƒ•แƒญแƒ˜แƒ แƒ“แƒ”แƒ‘แƒ แƒœแƒ”แƒ‘แƒ˜แƒกแƒ›แƒ˜แƒ”แƒ แƒ˜ แƒกแƒฃแƒ แƒแƒ—แƒ˜. แƒ›แƒ” แƒ’แƒแƒ›แƒแƒ•แƒ˜แƒงแƒ”แƒœแƒ”แƒ‘ archlinux: แƒฃแƒแƒฎแƒšแƒ”แƒกแƒ˜

docker pull archlinux

Docker pull แƒ“แƒ docker push แƒ‘แƒ แƒซแƒแƒœแƒ”แƒ‘แƒ”แƒ‘แƒ˜แƒก แƒ’แƒแƒœแƒฎแƒแƒ แƒชแƒ˜แƒ”แƒšแƒ”แƒ‘แƒ แƒ“แƒแƒ™แƒ”แƒ  แƒ™แƒšแƒ˜แƒ”แƒœแƒขแƒ˜แƒก แƒ’แƒแƒ แƒ”แƒจแƒ” HTTP แƒ›แƒแƒ—แƒฎแƒแƒ•แƒœแƒ”แƒ‘แƒ˜แƒก แƒ’แƒแƒ›แƒแƒงแƒ”แƒœแƒ”แƒ‘แƒ˜แƒ—

แƒแƒฎแƒšแƒ แƒจแƒ”แƒ•แƒ˜แƒœแƒแƒฎแƒแƒ— แƒ˜แƒ’แƒ˜ แƒแƒ“แƒ’แƒ˜แƒšแƒแƒ‘แƒ แƒ˜แƒ•แƒแƒ“ แƒจแƒ”แƒ›แƒ“แƒ’แƒแƒ›แƒ˜ แƒแƒœแƒแƒšแƒ˜แƒ–แƒ˜แƒกแƒ—แƒ•แƒ˜แƒก

docker save c24fe13d37b9 -o savedArch

Docker pull แƒ“แƒ docker push แƒ‘แƒ แƒซแƒแƒœแƒ”แƒ‘แƒ”แƒ‘แƒ˜แƒก แƒ’แƒแƒœแƒฎแƒแƒ แƒชแƒ˜แƒ”แƒšแƒ”แƒ‘แƒ แƒ“แƒแƒ™แƒ”แƒ  แƒ™แƒšแƒ˜แƒ”แƒœแƒขแƒ˜แƒก แƒ’แƒแƒ แƒ”แƒจแƒ” HTTP แƒ›แƒแƒ—แƒฎแƒแƒ•แƒœแƒ”แƒ‘แƒ˜แƒก แƒ’แƒแƒ›แƒแƒงแƒ”แƒœแƒ”แƒ‘แƒ˜แƒ—

แƒ’แƒแƒฎแƒกแƒ”แƒœแƒ˜แƒ— แƒ›แƒ˜แƒฆแƒ”แƒ‘แƒฃแƒšแƒ˜ แƒแƒ แƒฅแƒ˜แƒ•แƒ˜ แƒ›แƒ˜แƒ›แƒ“แƒ˜แƒœแƒแƒ แƒ” แƒ“แƒ˜แƒ แƒ”แƒฅแƒขแƒแƒ แƒ˜แƒแƒจแƒ˜

tar xvf savedArch

Docker pull แƒ“แƒ docker push แƒ‘แƒ แƒซแƒแƒœแƒ”แƒ‘แƒ”แƒ‘แƒ˜แƒก แƒ’แƒแƒœแƒฎแƒแƒ แƒชแƒ˜แƒ”แƒšแƒ”แƒ‘แƒ แƒ“แƒแƒ™แƒ”แƒ  แƒ™แƒšแƒ˜แƒ”แƒœแƒขแƒ˜แƒก แƒ’แƒแƒ แƒ”แƒจแƒ” HTTP แƒ›แƒแƒ—แƒฎแƒแƒ•แƒœแƒ”แƒ‘แƒ˜แƒก แƒ’แƒแƒ›แƒแƒงแƒ”แƒœแƒ”แƒ‘แƒ˜แƒ—

แƒ แƒแƒ’แƒแƒ แƒช แƒฎแƒ”แƒ“แƒแƒ•แƒ—, แƒ—แƒ˜แƒ—แƒแƒ”แƒฃแƒšแƒ˜ แƒกแƒแƒ›แƒแƒจแƒ•แƒ”แƒšแƒ แƒฎแƒแƒ–แƒ˜ แƒชแƒแƒšแƒ™แƒ” แƒกแƒแƒฅแƒแƒฆแƒแƒšแƒ“แƒ”แƒจแƒ˜แƒ. แƒแƒฎแƒšแƒ แƒ’แƒแƒ“แƒแƒ•แƒฎแƒ”แƒ“แƒแƒ— แƒฉแƒ•แƒ”แƒœ แƒ›แƒ˜แƒ”แƒ  แƒ›แƒ˜แƒฆแƒ”แƒ‘แƒฃแƒšแƒ˜ แƒ›แƒแƒœแƒ˜แƒคแƒ”แƒกแƒขแƒ˜แƒก แƒกแƒขแƒ แƒฃแƒฅแƒขแƒฃแƒ แƒแƒก

cat manifest.json | json_pp

Docker pull แƒ“แƒ docker push แƒ‘แƒ แƒซแƒแƒœแƒ”แƒ‘แƒ”แƒ‘แƒ˜แƒก แƒ’แƒแƒœแƒฎแƒแƒ แƒชแƒ˜แƒ”แƒšแƒ”แƒ‘แƒ แƒ“แƒแƒ™แƒ”แƒ  แƒ™แƒšแƒ˜แƒ”แƒœแƒขแƒ˜แƒก แƒ’แƒแƒ แƒ”แƒจแƒ” HTTP แƒ›แƒแƒ—แƒฎแƒแƒ•แƒœแƒ”แƒ‘แƒ˜แƒก แƒ’แƒแƒ›แƒแƒงแƒ”แƒœแƒ”แƒ‘แƒ˜แƒ—

แฒแƒ แƒช แƒ˜แƒกแƒ” แƒ‘แƒ”แƒ•แƒ แƒ˜. แƒ•แƒœแƒแƒฎแƒแƒ—, แƒ แƒ แƒ›แƒแƒœแƒ˜แƒคแƒ”แƒกแƒขแƒ˜แƒ แƒกแƒแƒญแƒ˜แƒ แƒ แƒฉแƒแƒขแƒ•แƒ˜แƒ แƒ—แƒ•แƒ˜แƒก แƒ›แƒ˜แƒฎแƒ”แƒ“แƒ•แƒ˜แƒ— แƒ“แƒแƒ™แƒฃแƒ›แƒ”แƒœแƒขแƒแƒชแƒ˜แƒ.

Docker pull แƒ“แƒ docker push แƒ‘แƒ แƒซแƒแƒœแƒ”แƒ‘แƒ”แƒ‘แƒ˜แƒก แƒ’แƒแƒœแƒฎแƒแƒ แƒชแƒ˜แƒ”แƒšแƒ”แƒ‘แƒ แƒ“แƒแƒ™แƒ”แƒ  แƒ™แƒšแƒ˜แƒ”แƒœแƒขแƒ˜แƒก แƒ’แƒแƒ แƒ”แƒจแƒ” HTTP แƒ›แƒแƒ—แƒฎแƒแƒ•แƒœแƒ”แƒ‘แƒ˜แƒก แƒ’แƒแƒ›แƒแƒงแƒ”แƒœแƒ”แƒ‘แƒ˜แƒ—

แƒชแƒฎแƒแƒ“แƒ˜แƒ, แƒแƒ แƒกแƒ”แƒ‘แƒฃแƒšแƒ˜ แƒ›แƒแƒœแƒ˜แƒคแƒ”แƒกแƒขแƒ˜ แƒฉแƒ•แƒ”แƒœแƒ—แƒ•แƒ˜แƒก แƒแƒ  แƒฏแƒ“แƒ”แƒ‘แƒ, แƒแƒ›แƒ˜แƒขแƒแƒ› แƒฉแƒ•แƒ”แƒœ แƒกแƒแƒ™แƒฃแƒ—แƒแƒ  แƒ—แƒแƒ•แƒก แƒ’แƒแƒ•แƒแƒ™แƒ”แƒ—แƒ”แƒ‘แƒ— แƒ‘แƒšแƒ”แƒฅแƒฏแƒ”แƒ™แƒ˜แƒกแƒ แƒ“แƒ แƒ™แƒฃแƒ แƒขแƒ˜แƒ–แƒแƒœแƒ”แƒ‘แƒ˜แƒก, แƒ›แƒแƒจแƒ•แƒ”แƒšแƒ”แƒ‘แƒ˜แƒกแƒ แƒ“แƒ แƒ™แƒแƒœแƒคแƒ˜แƒ’แƒฃแƒ แƒแƒชแƒ˜แƒ”แƒ‘แƒ˜แƒ—.

แƒฉแƒ•แƒ”แƒœ แƒงแƒแƒ•แƒ”แƒšแƒ—แƒ•แƒ˜แƒก แƒ’แƒ•แƒ”แƒฅแƒœแƒ”แƒ‘แƒ แƒ›แƒ˜แƒœแƒ˜แƒ›แƒฃแƒ› แƒ”แƒ แƒ—แƒ˜ แƒ™แƒแƒœแƒคแƒ˜แƒ’แƒฃแƒ แƒแƒชแƒ˜แƒ˜แƒก แƒคแƒแƒ˜แƒšแƒ˜ แƒ“แƒ แƒกแƒ˜แƒชแƒแƒชแƒฎแƒšแƒ˜แƒก แƒฎแƒแƒ–แƒ”แƒ‘แƒ˜แƒก แƒ›แƒแƒกแƒ˜แƒ•แƒ˜. แƒกแƒฅแƒ”แƒ›แƒ˜แƒก แƒ•แƒ”แƒ แƒกแƒ˜แƒ 2 (แƒ›แƒ˜แƒ›แƒ“แƒ˜แƒœแƒแƒ แƒ”แƒแƒ‘แƒก แƒฌแƒ”แƒ แƒ˜แƒก แƒ“แƒ แƒแƒก), mediaType แƒฃแƒชแƒ•แƒšแƒ”แƒšแƒ˜ แƒ“แƒแƒ แƒฉแƒ”แƒ‘แƒ:

echo โ€˜{
   "schemaVersion": 2,
   "mediaType": "application/vnd.docker.distribution.manifest.v2+json",
   "config": {
      "mediaType": "application/vnd.docker.container.image.v1+json",
      "size": config_size,
      "digest": "config_hash"
   },
   "layers": [
      โ€™ > manifest.json

แƒซแƒ˜แƒ แƒ˜แƒ—แƒแƒ“แƒ˜ แƒ›แƒแƒœแƒ˜แƒคแƒ”แƒกแƒขแƒ˜แƒก แƒจแƒ”แƒฅแƒ›แƒœแƒ˜แƒก แƒจแƒ”แƒ›แƒ“แƒ”แƒ’, แƒ—แƒฅแƒ•แƒ”แƒœ แƒฃแƒœแƒ“แƒ แƒจแƒ”แƒแƒ•แƒกแƒแƒ— แƒ˜แƒ’แƒ˜ แƒกแƒฌแƒแƒ แƒ˜ แƒ›แƒแƒœแƒแƒชแƒ”แƒ›แƒ”แƒ‘แƒ˜แƒ—. แƒแƒ›แƒ˜แƒกแƒแƒ—แƒ•แƒ˜แƒก แƒฉแƒ•แƒ”แƒœ แƒ•แƒ˜แƒงแƒ”แƒœแƒ”แƒ‘แƒ— แƒกแƒแƒ แƒ™แƒ˜แƒœแƒ˜แƒ’แƒ–แƒ แƒแƒ‘แƒ˜แƒ”แƒฅแƒขแƒ˜แƒก json แƒจแƒแƒ‘แƒšแƒแƒœแƒก:

{
         "mediaType": "application/vnd.docker.image.rootfs.diff.tar.gzip",
         "size": ${layersSizes[$i]},
         "digest": "sha256:${layersNames[$i]}"
      },

แƒฉแƒ•แƒ”แƒœ แƒ›แƒแƒก แƒ“แƒแƒ•แƒแƒ›แƒแƒขแƒ”แƒ‘แƒ— แƒ›แƒแƒœแƒ˜แƒคแƒ”แƒกแƒขแƒก แƒ—แƒ˜แƒ—แƒแƒ”แƒฃแƒšแƒ˜ แƒ แƒ”แƒšแƒกแƒ˜แƒกแƒ—แƒ•แƒ˜แƒก.

แƒจแƒ”แƒ›แƒ“แƒ”แƒ’แƒ˜, แƒฉแƒ•แƒ”แƒœ แƒฃแƒœแƒ“แƒ แƒ’แƒแƒ•แƒแƒ แƒ™แƒ•แƒ˜แƒแƒ— แƒ™แƒแƒœแƒคแƒ˜แƒ’แƒฃแƒ แƒแƒชแƒ˜แƒ˜แƒก แƒคแƒแƒ˜แƒšแƒ˜แƒก แƒ–แƒแƒ›แƒ แƒ“แƒ แƒฉแƒแƒ•แƒแƒœแƒแƒชแƒ•แƒšแƒแƒ— แƒ›แƒแƒœแƒ˜แƒคแƒ”แƒกแƒขแƒ˜แƒก แƒœแƒแƒ™แƒ”แƒ แƒ”แƒ‘แƒ˜ แƒ แƒ”แƒแƒšแƒฃแƒ แƒ˜ แƒ›แƒแƒœแƒแƒชแƒ”แƒ›แƒ”แƒ‘แƒ˜แƒ—

sed -i "s/config_size/$configSize/g; s/config_hash/$configName/g" $manifestFile

แƒแƒฎแƒšแƒ แƒ—แƒฅแƒ•แƒ”แƒœ แƒจแƒ”แƒ’แƒ˜แƒซแƒšแƒ˜แƒแƒ— แƒ“แƒแƒ˜แƒฌแƒงแƒแƒ— แƒฉแƒแƒ›แƒแƒขแƒ•แƒ˜แƒ แƒ—แƒ•แƒ˜แƒก แƒžแƒ แƒแƒชแƒ”แƒกแƒ˜ แƒ“แƒ แƒจแƒ”แƒ˜แƒœแƒแƒฎแƒแƒ— uuid, แƒ แƒแƒ›แƒ”แƒšแƒ˜แƒช แƒฃแƒœแƒ“แƒ แƒแƒฎแƒšแƒ“แƒ”แƒก แƒงแƒ•แƒ”แƒšแƒ แƒจแƒ”แƒ›แƒ“แƒ’แƒแƒ› แƒ›แƒแƒ—แƒฎแƒแƒ•แƒœแƒแƒก.

แƒกแƒ แƒฃแƒšแƒ˜ แƒกแƒ™แƒ แƒ˜แƒžแƒขแƒ˜ แƒแƒกแƒ” แƒ’แƒแƒ›แƒแƒ˜แƒงแƒฃแƒ แƒ”แƒ‘แƒ:

#!/bin/bash -eux

imageDir=$1
# url as http://localhost:8081/link/to/docker/registry
url=$2
repoName=$3
tag=$4
manifestFile=$(readlink -f ${imageDir}/manifestCopy)
configFile=$(readlink -f $(find $imageDir -name "*.json" ! -name "manifest.json"))

# calc layers sha 256 sum, rename them accordingly, and add info about each to manifest file
function prepareLayersForUpload() {
  info_file=$imageDir/info
  # lets calculate layers sha256 and use it as layers names further
  layersNames=($(find $imageDir -name "layer.tar" -exec shasum -a 256 {} ; | cut -d" " -f1))

  # rename layers according to shasums. !!!Set required amount of fields for cut command!!!
  # this part definitely can be done easier but i didn't found another way, sry
  find $imageDir -name "layer.tar" -exec bash -c 'mv {} "$(echo {} | cut -d"/" -f1,2)/$(shasum -a 256 {} | cut -d" " -f1)"' ;

  layersSizes=($(find $imageDir -name "*.tar" -exec ls -l {} ; | awk '{print $5}'))

  for i in "${!layersNames[@]}"; do
    echo "{
         "mediaType": "application/vnd.docker.image.rootfs.diff.tar.gzip",
         "size": ${layersSizes[$i]},
         "digest": "sha256:${layersNames[$i]}"
      }," >> $manifestFile
  done
  # remove last ','
  truncate -s-2 $manifestFile
  # add closing brakets to keep json consistent
  printf "nt]n}" >> $manifestFile
}

# calc config sha 256 sum and add info about it to manifest
function setConfigProps() {
  configSize=$(ls -l $configFile | awk '{print $5}')
  configName=$(basename $configFile | cut -d"." -f1)

  sed -i "s/config_size/$configSize/g; s/config_hash/$configName/g" $manifestFile
}

#prepare manifest file
prepareLayersForUpload
setConfigProps
cat $manifestFile

# initiate upload and get uuid
uuid=$(curl -s -X POST -I "$url/v2/$repoName/blobs/uploads/" | grep -oP "(?<=Docker-Upload-Uuid: ).+")

# patch layers
# in data-binary we're getting absolute path to layer file
for l in "${!layersNames[@]}"; do
  pathToLayer=$(find $imageDir -name ${layersNames[$l]} -exec readlink -f {} ;)
    curl -v -X PATCH "$url/v2/$repoName/blobs/uploads/$uuid" 
  -H "Content-Length: ${layersSizes[$i]}" 
  -H "Content-Type: application/octet-stream" 
  --data-binary "@$pathToLayer"

# put layer
  curl -v -X PUT "$url/v2/$repoName/blobs/uploads/$uuid?digest=sha256:${layersNames[$i]}" 
  -H 'Content-Type: application/octet-stream' 
  -H "Content-Length: ${layersSizes[$i]}" 
  --data-binary "@$pathToLayer"
done

# patch and put config after all layers
curl -v -X PATCH "$url/v2/$repoName/blobs/uploads/$uuid" 
  -H "Content-Length: $configSize" 
  -H "Content-Type: application/octet-stream" 
  --data-binary "@$configFile"

  curl -v -X PUT "$url/v2/$repoName/blobs/uploads/$uuid?digest=sha256:$configName" 
  -H 'Content-Type: application/octet-stream' 
  -H "Content-Length: $configSize" 
  --data-binary "@$configFile"

# put manifest
curl -v -X PUT "$url/v2/$repoName/manifests/$tag" 
  -H 'Content-Type: application/vnd.docker.distribution.manifest.v2+json' 
  --data-binary "@$manifestFile"

exit 0

แƒฉแƒ•แƒ”แƒœ แƒจแƒ”แƒ’แƒ•แƒ˜แƒซแƒšแƒ˜แƒ แƒ’แƒแƒ›แƒแƒ•แƒ˜แƒงแƒ”แƒœแƒแƒ— แƒ›แƒ–แƒ แƒกแƒ™แƒ แƒ˜แƒžแƒขแƒ˜:

./uploadImage.sh "~/path/to/saved/image" "http://localhost:8081/link/to/docker/registry" myRepoName 1.0

UPD:
แƒ แƒ แƒ›แƒ˜แƒ•แƒ˜แƒฆแƒ”แƒ— แƒจแƒ”แƒ“แƒ”แƒ’แƒแƒ“?
แƒฃแƒžแƒ˜แƒ แƒ•แƒ”แƒšแƒ”แƒก แƒงแƒแƒ•แƒšแƒ˜แƒกแƒ, แƒ แƒ”แƒแƒšแƒฃแƒ แƒ˜ แƒ›แƒแƒœแƒแƒชแƒ”แƒ›แƒ”แƒ‘แƒ˜ แƒแƒœแƒแƒšแƒ˜แƒ–แƒ˜แƒกแƒ—แƒ•แƒ˜แƒก, แƒ แƒแƒ“แƒ’แƒแƒœ แƒขแƒ”แƒกแƒขแƒ”แƒ‘แƒ˜ แƒขแƒแƒ แƒ“แƒ”แƒ‘แƒ แƒ‘แƒšแƒแƒ–แƒ”แƒ›แƒ”แƒขแƒ แƒจแƒ˜ แƒ“แƒ แƒ›แƒแƒœแƒแƒชแƒ”แƒ›แƒ”แƒ‘แƒ˜ แƒ“แƒแƒ™แƒ”แƒ แƒ˜แƒก แƒ™แƒšแƒ˜แƒ”แƒœแƒขแƒ˜แƒก แƒ›แƒแƒ—แƒฎแƒแƒ•แƒœแƒ”แƒ‘แƒ–แƒ” แƒแƒ  แƒแƒ แƒ˜แƒก แƒซแƒแƒšแƒ˜แƒแƒœ แƒ˜แƒœแƒคแƒแƒ แƒ›แƒแƒขแƒ˜แƒฃแƒšแƒ˜, แƒ’แƒแƒœแƒกแƒฎแƒ•แƒแƒ•แƒ”แƒ‘แƒ˜แƒ— แƒกแƒฃแƒคแƒ—แƒ HTTP แƒ›แƒแƒ—แƒฎแƒแƒ•แƒœแƒ”แƒ‘แƒ˜แƒกแƒ’แƒแƒœ.

แƒ›แƒ”แƒแƒ แƒ”แƒช, แƒ’แƒแƒ แƒ“แƒแƒ›แƒแƒ•แƒแƒšแƒ›แƒ แƒกแƒแƒจแƒฃแƒแƒšแƒ”แƒ‘แƒ แƒ›แƒแƒ’แƒ•แƒชแƒ แƒ’แƒแƒ•แƒ–แƒแƒ แƒ“แƒแƒ— แƒ•แƒ˜แƒ แƒขแƒฃแƒแƒšแƒฃแƒ แƒ˜ แƒ›แƒแƒ›แƒฎแƒ›แƒแƒ แƒ”แƒ‘แƒšแƒ”แƒ‘แƒ˜แƒก แƒ แƒแƒแƒ“แƒ”แƒœแƒแƒ‘แƒ แƒ“แƒแƒ™แƒ”แƒ แƒ˜แƒก แƒแƒขแƒ•แƒ˜แƒ แƒ—แƒ•แƒ˜แƒกแƒ—แƒ•แƒ˜แƒก แƒ“แƒแƒแƒฎแƒšแƒแƒ”แƒ‘แƒ˜แƒ— 150%-แƒ˜แƒ— แƒ“แƒ แƒ›แƒ˜แƒ•แƒ˜แƒฆแƒแƒ— แƒกแƒแƒจแƒฃแƒแƒšแƒ แƒžแƒแƒกแƒฃแƒฎแƒ˜แƒก แƒ“แƒ แƒ 20-25%-แƒ˜แƒ— แƒฃแƒคแƒ แƒ แƒกแƒฌแƒ แƒแƒคแƒแƒ“. แƒ“แƒแƒ™แƒ”แƒ แƒ˜แƒก แƒฉแƒแƒ›แƒแƒขแƒ•แƒ˜แƒ แƒ—แƒ•แƒ˜แƒกแƒ—แƒ•แƒ˜แƒก แƒฉแƒ•แƒ”แƒœ แƒจแƒ”แƒ•แƒซแƒ”แƒšแƒ˜แƒ— แƒ›แƒแƒ›แƒฎแƒ›แƒแƒ แƒ”แƒ‘แƒ”แƒšแƒ—แƒ แƒ แƒแƒแƒ“แƒ”แƒœแƒแƒ‘แƒ˜แƒก 500%-แƒ˜แƒ— แƒ’แƒแƒ–แƒ แƒ“แƒ, แƒฎแƒแƒšแƒ แƒกแƒแƒจแƒฃแƒแƒšแƒ แƒžแƒแƒกแƒฃแƒฎแƒ˜แƒก แƒ“แƒ แƒ แƒ“แƒแƒแƒฎแƒšแƒแƒ”แƒ‘แƒ˜แƒ— 60%-แƒ˜แƒ— แƒจแƒ”แƒ›แƒชแƒ˜แƒ แƒ“แƒ.

แƒ“แƒ˜แƒ“แƒ˜ แƒ›แƒแƒ“แƒšแƒแƒ‘แƒ แƒงแƒฃแƒ แƒแƒ“แƒฆแƒ”แƒ‘แƒ˜แƒกแƒ—แƒ•แƒ˜แƒก.

แƒฌแƒงแƒแƒ แƒ: www.habr.com

แƒแƒฎแƒแƒšแƒ˜ แƒ™แƒแƒ›แƒ”แƒœแƒขแƒแƒ แƒ˜แƒก แƒ“แƒแƒ›แƒแƒขแƒ”แƒ‘แƒ