เดเดเตเดเตพเดเตเดเต 2 เดฌเดพเดเต เดชเตเดฒเตเดฒเต, 75 เดฎเตเดธเตโเดเดฒเตเตป เดเดพเดฌเตโเดฒเตเดฑเตเดฑเตเดเตพ เดฏเตเดฃเดฟเดเตเดธเต เดเตปเดตเดฏเตเตบเดฎเตเตปเตเดฑเต, เดเดฐเต เดกเตเดเตเดเตผ เดฑเดฟเดชเตเดชเตเดธเดฟเดฑเตเดฑเดฑเดฟ, เดกเตเดเตเดเตผ เดเตเดฒเดฏเตปเตเดฑเต เดเดฒเตเดฒเดพเดคเต เดกเตเดเตเดเตผ เดชเตเตพ, เดกเตเดเตเดเตผ เดชเตเดทเต เดเดฎเดพเตปเดกเตเดเตพ เดจเดเดชเตเดชเดฟเดฒเดพเดเตเดเตเดจเตเดจเดคเดฟเดจเตเดณเตเดณ เดเตเดฎเดคเดฒ เดเดจเตเดจเดฟเดต เดเดฃเตเดเดพเดฏเดฟเดฐเตเดจเตเดจเต.
เดฏเตเดชเดฟเดเดธเต:
เดเตเดฆเตเดฏเด: เดเดคเตเดฒเตเดฒเดพเด เดเดจเตเดคเดฟเดจเตเดตเตเดฃเตเดเดฟเดฏเดพเดฃเต?
เดเดคเตเดคเดฐเด: เดเตฝเดชเตเดชเดจเตเดจเดคเตเดคเดฟเตปเตเดฑเต เดฒเตเดกเต เดเตเดธเตเดฑเตเดฑเดฟเดเดเต (เดฌเดพเดทเต เดเดชเดฏเตเดเดฟเดเตเดเตเดจเตเดจเดฟเดฒเตเดฒ, เดตเดฟเดฆเตเดฏเดพเดญเตเดฏเดพเดธ เดเดตเดถเตเดฏเดเตเดเตพเดเตเดเดพเดฏเดฟ เดธเตเดเตเดฐเดฟเดชเตเดฑเตเดฑเตเดเตพ เดจเตฝเดเดฟเดฏเดฟเดเตเดเตเดฃเตเดเต). เด
เดงเดฟเด เดฒเตเดฏเดฑเตเดเตพ เดเตเดฑเดฏเตเดเตเดเตเดจเตเดจเดคเดฟเดจเต (เดจเตเดฏเดพเดฏเดฎเดพเดฏ เดชเดฐเดฟเดงเดฟเดเตเดเตเดณเตเดณเดฟเตฝ) เดกเตเดเตเดเตผ เดเตเดฒเดฏเตปเตเดฑเต เดเดชเดฏเตเดเดฟเดเตเดเตเดฃเตเดเดคเดฟเดฒเตเดฒเตเดจเตเดจเต เดคเตเดฐเตเดฎเดพเดจเดฟเดเตเดเต, เด
เดคเดจเตเดธเดฐเดฟเดเตเดเต, เดเดฏเตผเดจเตเดจ เดฒเตเดกเต เด
เดจเตเดเดฐเดฟเดเตเดเตเด. เดคเตฝเดซเดฒเดฎเดพเดฏเดฟ, เดกเตเดเตเดเตผ เดเตเดฒเดฏเตปเตเดฑเดฟเตปเดฑเต เดเดฒเตเดฒเดพ เดธเดฟเดธเตเดฑเตเดฑเด เดเดพเดฒเดคเดพเดฎเดธเดเตเดเดณเตเด เดจเตเดเตเดเด เดเตเดฏเตเดคเต. เดเดเตเดเตพเดเตเดเต เดเตฝเดชเตเดชเดจเตเดจเดคเตเดคเดฟเตฝ เดจเตเดฐเดฟเดเตเดเต เดคเดพเดฐเดคเดฎเตเดฏเตเดจ เดถเตเดฆเตเดงเดฎเดพเดฏ เดฒเตเดกเต เดฒเดญเดฟเดเตเดเต.
เดฒเตเดเดจเดคเตเดคเดฟเตฝ เดเดชเดเดฐเดฃเดเตเดเดณเตเดเต เดเตเดจเต เดชเดคเดฟเดชเตเดชเตเดเตพ เดเดชเดฏเตเดเดฟเดเตเดเต.
เดเดฆเตเดฏเด, เด เดเดฎเดพเตปเดกเตเดเตพ เดเดจเตเดคเดพเดฃเต เดเตเดฏเตเดฏเตเดจเตเดจเดคเตเดจเตเดจเต เดจเดฎเตเดเตเดเต เดจเตเดเตเดเดพเด.
เด
เดชเตเดชเตเตพ เดกเตเดเตเดเตผ เดชเตเตพ เดเดจเตเดคเดฟเดจเตเดตเตเดฃเตเดเดฟเดฏเดพเดฃเต เดเดชเดฏเตเดเดฟเดเตเดเตเดจเตเดจเดคเต? เดเดคเดจเตเดธเดฐเดฟเดเตเดเต
"เดเดฐเต เดฐเดเดฟเดธเตเดเตเดฐเดฟเดฏเดฟเตฝ เดจเดฟเดจเตเดจเต เดเดฐเต เดเดฎเตเดเต เด เดฒเตเดฒเตเดเตเดเดฟเตฝ เดเดฐเต เดถเตเดเดฐเด เดตเดฒเดฟเดเตเดเตเด".
เด
เดคเดฟเดจเตเดณเตเดณ เดเดฐเต เดฒเดฟเดเตเดเตเด เด
เดตเดฟเดเต เดเดพเดฃเดพเด
เดเดฟเดคเตเดฐเดคเตเดคเดฟเดฒเต เดเดฑเตเดฑเดตเตเด เดชเตเดคเดฟเดฏ เดฎเดพเดฑเตเดฑเดเตเดเดณเตเดเตเดเตเดฑเดฟเดเตเดเตเดณเตเดณ เดตเดฟเดตเดฐเดเตเดเตพ เดเตพเดเตเดเตเดณเตเดณเตเดจเตเดจ เดเดฟเดฒ เดฒเตเดฏเดฑเตเดเดณเตเดเต เดเดฐเต เดเตเดเตเดเดฎเดพเดฃเต เดกเตเดเตเดเตผ เดเดฎเตเดเต เดเดจเตเดจเต เดเดตเดฟเดเต เดจเดฟเดจเตเดจเต เดจเดฎเตเดเตเดเต เดฎเดจเดธเตเดธเดฟเดฒเดพเดเตเดเดพเด, เด
เดคเต เดจเดฎเตเดเตเดเต เดเดตเดถเตเดฏเดฎเตเดณเตเดณเดคเดพเดฃเต. เด
เดเตเดคเตเดคเดคเดพเดฏเดฟ เดเดเตเดเตพ เดจเตเดเตเดเตเดจเตเดจเต
เด เดคเดฟเตฝ เดเดจเดฟเดชเตเดชเดฑเดฏเตเดจเตเดจเดต เดชเดฑเดฏเตเดจเตเดจเต:
"เดเดฐเต "เดเดฟเดคเตเดฐเด" เดเดจเตเดจเดคเต เดเดฐเต 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"
เดชเตเดฐเดคเดฟเดเดฐเดฃเดฎเดพเดฏเดฟ, เดเดเตเดเตพเดเตเดเต 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
เดเดฆเตเดฏ เดฒเตเดซเตโเดฒเตเตป เดเดฏเดฟ เดเดเตเดตเดฟเตฝ เดจเดฎเตเดเตเดเต เดฒเดญเดฟเดเตเดเดคเต เดเดคเตเดคเดฐเด เดซเดฏเดฒเดพเดฃเตเดจเตเดจเต เดจเตเดเตเดเดพเด.
file firstLayer
เด. เดฑเตเดฏเดฟเดฒเตเดเตพ เดเดพเตผ เดเตผเดเตเดเตเดตเตเดเดณเดพเดฃเต, เด เดต เดเดเดฟเดคเดฎเดพเดฏ เดเตเดฐเดฎเดคเตเดคเดฟเตฝ เด เตบเดชเดพเดเตเดเต เดเตเดฏเตเดคเดพเตฝ เดจเดฎเตเดเตเดเต เดเดฟเดคเตเดฐเดคเตเดคเดฟเตปเตเดฑเต เดเดณเตเดณเดเดเตเดเด เดฒเดญเดฟเดเตเดเตเด.
เดเดฐเต เดเตเดฑเดฟเดฏ เดฌเดพเดทเต เดธเตเดเตเดฐเดฟเดชเตเดฑเตเดฑเต เดเดดเตเดคเดพเด, เด เดเตเดเดจเต เดเดฒเตเดฒเดพเด เดเดเตเดเตเดฎเตเดฑเตเดฑเต เดเตเดฏเตเดฏเดพเด
#!/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}
เดเดณเตเดณเดเดเตเด เดฆเตเตผเดเตเดฏเด: {เดชเดพเดณเดฟเดฏเตเดเต เดตเดฒเดฟเดชเตเดชเด}
เดเดณเตเดณเดเดเตเด เดคเดฐเด: เดเดชเตเดฒเดฟเดเตเดเตเดทเตป/เดเดเตเดเดฑเตเดฑเต-เดธเตเดเตเดฐเตเด
เดฒเตเดฏเตผ เดฌเตเดจเดฑเดฟ เดกเดพเดฑเตเดฑ". - เดฎเดพเดจเดฟเดซเตเดธเตเดฑเตเดฑเต เดฒเตเดกเตเดเตเดฏเตเดฏเตเดจเตเดจเต - "PUT /v2/{repoName}/manifests/{reference}".
เดเดจเตเดจเดพเตฝ เดกเตเดเตเดฏเตเดฎเตเตปเตเดฑเตเดทเตป เดเดฐเต เดเดเตเดเด เดจเดทเตโเดเดชเตเดชเตเดเตเดคเตเดคเตเดจเตเดจเต, เด เดคเดฟเดฒเตเดฒเดพเดคเต เดเดจเตเดจเตเด เดชเตเดฐเดตเตผเดคเตเดคเดฟเดเตเดเดฟเดฒเตเดฒ. เดฎเตเดฃเตเดฒเดฟเดคเตเดคเดฟเดเตเดเต เดฒเตเดกเดฟเดเดเดฟเดจเตเด เดญเดพเดเดฟเดเดฎเดพเดฏเดฟ (เดเดเตเดเตเดกเต) เดฑเตเดฏเดฟเตฝ เดฒเตเดกเตเดเตเดฏเตเดฏเตเดจเตเดจเดคเดฟเดจเต เดฎเตเดฎเตเดชเต, เดจเดฟเดเตเดเตพ เดเดฐเต เดชเดพเดเตเดเต เด เดญเตเดฏเตผเดคเตเดฅเดจ เดจเดเดคเตเดคเดฃเด:
"PATCH /v2/{repoName}/blobs/uploads/{uuid}
เดเดณเตเดณเดเดเตเด เดฆเตเตผเดเตเดฏเด: {เดเดเตเดเดฟเตปเตเดฑเต เดตเดฒเดฟเดชเตเดชเด}
เดเดณเตเดณเดเดเตเด เดคเดฐเด: เดเดชเตเดฒเดฟเดเตเดเตเดทเตป/เดเดเตเดเดฑเตเดฑเต-เดธเตเดเตเดฐเตเด
{เดฒเตเดฏเตผ เดเดเตเดเต เดฌเตเดจเดฑเดฟ เดกเดพเดฑเตเดฑ}".
เด เดฒเตเดฒเตเดเตเดเดฟเตฝ, เดจเดฟเดเตเดเตพเดเตเดเต เดเดฆเตเดฏ เดชเตเดฏเดฟเตปเตเดฑเดฟเดจเดชเตเดชเตเดฑเด เดจเตเดเตเดเดพเตป เดเดดเดฟเดฏเดฟเดฒเตเดฒ, เดเดพเดฐเดฃเด... เดชเตเดฐเดคเตเดเตเดทเดฟเดเตเดเตเดจเตเดจ เดชเตเดฐเดคเดฟเดเดฐเดฃ เดเตเดกเต 202-เดจเต เดชเดเดฐเด, เดจเดฟเดเตเดเตพเดเตเดเต 4xx เดฒเดญเดฟเดเตเดเตเด.
เดเดชเตเดชเตเตพ เด เตฝเดเตเดฐเดฟเดคเด เดเดคเตเดชเตเดฒเต เดเดพเดฃเดชเตเดชเตเดเตเดจเตเดจเต:
- เดชเตเดฐเดพเดฐเดเดญเด
- เดชเดพเดเตเดเต เดฑเตเดฏเดฟเตฝ
- เดนเดพเตปเดกเตโเดฑเตเดฏเดฟเตฝ เดฒเตเดกเต เดเตเดฏเตเดฏเตเดจเตเดจเต
- เดฎเดพเดจเดฟเดซเตเดธเตเดฑเตเดฑเต เดฒเตเดกเต เดเตเดฏเตเดฏเตเดจเตเดจเต
เดฏเดฅเดพเดเตเดฐเดฎเด 2-เดเด 3-เดเด เดชเตเดฏเดฟเตปเตเดฑเตเดเตพ, เดเดคเตเดฐ เดตเดฐเดฟเดเตพ เดฒเตเดกเตเดเตเดฏเตเดฏเตเดฃเตเดเดคเตเดฃเตเดเต เด เดคเตเดฐเดฏเตเด เดคเดตเดฃ เดเดตเตผเดคเตเดคเดฟเดเตเดเตเด.
เดเดฆเตเดฏเด, เดจเดฎเตเดเตเดเต เดเดคเตเดเตเดเดฟเดฒเตเด เดเดฟเดคเตเดฐเด เดเดตเดถเตเดฏเดฎเดพเดฃเต. เดเดพเตป archlinux:latest เดเดชเดฏเตเดเดฟเดเตเดเตเด
docker pull archlinux
เดเดจเดฟ เดเตเดเตเดคเตฝ เดตเดฟเดถเดเดฒเดจเดคเตเดคเดฟเดจเดพเดฏเดฟ เดเดคเต เดชเตเดฐเดพเดฆเตเดถเดฟเดเดฎเดพเดฏเดฟ เดธเดเดฐเดเตเดทเดฟเดเตเดเดพเด
docker save c24fe13d37b9 -o savedArch
เดคเดคเตเดซเดฒเดฎเดพเดฏเตเดฃเตเดเดพเดเตเดจเตเดจ เดเตผเดเตเดเตเดตเต เดจเดฟเดฒเดตเดฟเดฒเต เดกเดฏเดฑเดเตเดเดฑเดฟเดฏเดฟเดฒเตเดเตเดเต เด เตบเดชเดพเดเตเดเต เดเตเดฏเตเดฏเตเด
tar xvf savedArch
เดจเดฟเดเตเดเตพเดเตเดเต เดเดพเดฃเดพเดจเดพเดเตเดจเตเดจเดคเตเดชเตเดฒเต, เดเดฐเต เดฒเตเดซเตโเดฒเตเดจเตเด เดเดฐเต เดชเตเดฐเดคเตเดฏเตเด เดซเตเตพเดกเดฑเดฟเดฒเดพเดฃเต. เดเดจเดฟ เดจเดฎเตเดเตเดเต เดฒเดญเดฟเดเตเด เดฎเดพเดจเดฟเดซเตเดธเตเดฑเตเดฑเดฟเตปเตเดฑเต เดเดเดจ เดจเตเดเตเดเดพเด
cat manifest.json | json_pp
เดตเดณเดฐเตเดฏเดงเดฟเดเดฎเดฟเดฒเตเดฒ. เดฒเตเดกเตเดเตเดฏเตเดฏเดพเตป เดเดตเดถเตเดฏเดฎเดพเดฏ เดฎเดพเดจเดฟเดซเตเดธเตเดฑเตเดฑเต เดเดจเตเดคเดพเดฃเตเดจเตเดจเต เดจเตเดเตเดเดพเด
เดตเตเดฏเดเตเดคเดฎเดพเดฏเตเด, เดจเดฟเดฒเดตเดฟเดฒเตเดณเตเดณ เดฎเดพเดจเดฟเดซเตเดธเตเดฑเตเดฑเต เดเดเตเดเตพเดเตเดเต เด เดจเตเดฏเตเดเตเดฏเดฎเดฒเตเดฒ, เด เดคเดฟเดจเดพเตฝ เดฌเตเดฒเดพเดเตเดเต เดเดพเดเตเดเตเด เดตเตเดถเตเดฏเดเดณเตเด, เดฒเตเดซเตโเดฒเตเดจเตเดเดณเตเด เดเตเตบเดซเดฟเดเตเดทเดจเตเดเดณเตเด เดเดชเดฏเตเดเดฟเดเตเดเต เดเดเตเดเตพ เดธเตเดตเดจเตเดคเดฎเดพเดฏเดฟ เดจเดฟเตผเดฎเตเดฎเดฟเดเตเดเตเด.
เดเดเตเดเตพเดเตเดเต เดเดฒเตเดฒเดพเดฏเตโเดชเตเดชเตเดดเตเด เดเตเดฑเดเตเดเดคเต เดเดฐเต เดเตเตบเดซเดฟเดเดฑเตเดทเตป เดซเดฏเดฒเตเด เดฒเตเดซเต เดฒเตเดจเตเดเดณเตเดเต เดเดฐเต เดจเดฟเดฐเดฏเตเด เดเดฃเตเดเดพเดฏเดฟเดฐเดฟเดเตเดเตเด. เดธเตเดเตเด เดชเดคเดฟเดชเตเดชเต 2 (เดเดดเตเดคเตเดจเตเดจ เดธเดฎเดฏเดคเตเดคเต เดจเดฟเดฒเดตเดฟเดฒเตเดณเตเดณเดคเต), เดฎเตเดกเดฟเดฏเดเตเดชเตเดชเต เดฎเดพเดฑเตเดฑเดฎเดฟเดฒเตเดฒเดพเดคเต เดคเตเดเดฐเตเด:
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
เดฏเตเดชเดฟเดเดธเต:
เด
เดคเดฟเตปเตเดฑเต เดซเดฒเดฎเดพเดฏเดฟ เดจเดฎเตเดเตเดเต เดเดจเตเดคเดพเดฃเต เดฒเดญเดฟเดเตเดเดคเต?
เดเดจเตเดจเดพเดฎเดคเดพเดฏเดฟ, เดตเดฟเดถเดเดฒเดจเดคเตเดคเดฟเดจเดพเดฏเตเดณเตเดณ เดฏเดฅเดพเตผเดคเตเดฅ เดกเดพเดฑเตเดฑ, เดฌเตเดฒเตเดธเตโเดฎเตเดฑเตเดฑเดฑเดฟเดฒเดพเดฃเต เดเตเดธเตเดฑเตเดฑเตเดเตพ เดชเตเดฐเดตเตผเดคเตเดคเดฟเดเตเดเตเดจเตเดจเดคเต, เดเตเดเดพเดคเต เดกเตเดเตเดเตผ เดเตเดฒเดฏเตปเตเดฑเต เด
เดญเตเดฏเตผเดคเตเดฅเดจเดเดณเดฟเดฒเต เดกเดพเดฑเตเดฑ เดถเตเดฆเตเดงเดฎเดพเดฏ HTTP เด
เดญเตเดฏเตผเดคเตเดฅเดจเดเดณเดฟเตฝ เดจเดฟเดจเตเดจเต เดตเตเดฏเดคเตเดฏเดธเตเดคเดฎเดพเดฏเดฟ เดตเดณเดฐเต เดตเดฟเดตเดฐเดฆเดพเดฏเดเดฎเดฒเตเดฒ.
เดฐเดฃเตเดเดพเดฎเดคเดพเดฏเดฟ, เดกเตเดเตเดเตผ เด เดชเตโเดฒเตเดกเดฟเดจเดพเดฏเตเดณเตเดณ เดตเตเตผเดเตเดตเตฝ เดเดชเดฏเตเดเตเดคเดพเดเตเดเดณเตเดเต เดเดฃเตเดฃเด เดเดเดฆเตเดถเด 150% เดตเตผเดฆเตเดงเดฟเดชเตเดชเดฟเดเตเดเดพเดจเตเด เดถเดฐเดพเดถเดฐเดฟ เดชเตเดฐเดคเดฟเดเดฐเดฃ เดธเดฎเดฏเด 20-25% เดตเตเดเดคเตเดคเดฟเตฝ เดจเตเดเดพเดจเตเด เดธเดเดเตเดฐเดฎเดฃเด เดเดเตเดเดณเต เด เดจเตเดตเดฆเดฟเดเตเดเต. เดกเตเดเตเดเตผ เดกเตเตบเดฒเตเดกเดฟเดจเดพเดฏเดฟ, เดเดชเดฏเตเดเตเดคเดพเดเตเดเดณเตเดเต เดเดฃเตเดฃเด 500% เดตเตผเดฆเตเดงเดฟเดชเตเดชเดฟเดเตเดเดพเตป เดเดเตเดเตพเดเตเดเต เดเดดเดฟเดเตเดเต, เด เดคเตเดธเดฎเดฏเด เดถเดฐเดพเดถเดฐเดฟ เดชเตเดฐเดคเดฟเดเดฐเดฃ เดธเดฎเดฏเด เดเดเดฆเตเดถเด 60% เดเตเดฑเดเตเดเต.
เดจเดฟเดเตเดเดณเตเดเต เดถเตเดฐเดฆเตเดงเดฏเตเดเตเดเต เดจเดจเตเดฆเดฟ.
เด เดตเดฒเดเดฌเด: www.habr.com