เช เชฎเชพเชฐเซ เชชเชพเชธเซ เชเชพเชธเชจเซ 2 เชฌเซเช เชนเชคเซ, 75 เชฎเซเชธเซเชเซเชฒเชฟเชจ เชเซเชฌเซเชฒเซเชเซเชธ เชฏเซเชจเชฟเชเซเชธ เชเชจเซเชตเชพเชฏเชฐเซเชจเชฎเซเชจเซเช, เชเช เชกเซเชเชฐ เชฐเชฟเชชเซเชเซเชเชฐเซ เช เชจเซ เชกเซเชเชฐ เชเซเชฒเชพเชฏเชจเซเช เชตเชฟเชจเชพ เชกเซเชเชฐ เชชเซเชฒ เช เชจเซ เชกเซเชเชฐ เชชเซเชถ เชเชฆเซเชถเซเชจเซ เช เชฎเชฒเชฎเชพเช เชฎเซเชเชตเชพเชจเซเช เชเชพเชฐเซเชฏ เชนเชคเซเช.
เชฏเซเชชเซเชกเซ:
เชชเซเชฐเชถเซเชจ: เช เชฌเชงเซเช เชถเซเชจเชพ เชฎเชพเชเซ เชเซ?
เชเชตเชพเชฌ: เชเชคเซเชชเชพเชฆเชจเชจเซเช เชฒเซเชก เชชเชฐเซเชเซเชทเชฃ (เชฌเซเชถเชจเซ เชเชชเชฏเซเช เชจเชนเซเช, เชธเซเชเซเชฐเชฟเชชเซเชเซ เชถเซเชเซเชทเชฃเชฟเช เชนเซเชคเซเช เชฎเชพเชเซ เชชเซเชฐเชฆเชพเชจ เชเชฐเชตเชพเชฎเชพเช เชเชตเซ เชเซ). เชตเชงเชพเชฐเชพเชจเชพ เชธเซเชคเชฐเซ (เชตเชพเชเชฌเซ เชฎเชฐเซเชฏเชพเชฆเชพเชฎเชพเช) เชเชเชพเชกเชตเชพ เชฎเชพเชเซ เชกเซเชเชฐ เชเซเชฒเชพเชฏเชเชเชจเซ เชเชชเชฏเซเช เชจ เชเชฐเชตเชพเชจเซ เชจเชฟเชฐเซเชฃเชฏ เชฒเซเชตเชพเชฎเชพเช เชเชตเซเชฏเซ เชนเชคเซ เช
เชจเซ เชคเซ เชฎเซเชเชฌ, เชตเชงเซ เชญเชพเชฐเชจเซเช เช
เชจเซเชเชฐเชฃ เชเชฐเชตเชพเชฎเชพเช เชเชตเซเชฏเซเช เชนเชคเซเช. เชชเชฐเชฟเชฃเชพเชฎเซ, เชกเซเชเชฐ เชเซเชฒเชพเชฏเชเชเชจเชพ เชคเชฎเชพเชฎ เชธเชฟเชธเซเชเชฎ เชตเชฟเชฒเชเชฌ เชฆเซเชฐ เชเชฐเชตเชพเชฎเชพเช เชเชตเซเชฏเชพ เชนเชคเชพ. เช
เชฎเชจเซ เชเชคเซเชชเชพเชฆเชจ เชชเชฐ เชธเซเชงเซ เชชเซเชฐเชฎเชพเชฃเชฎเชพเช เชธเซเชตเชเซเช เชฒเซเชก เชฎเชณเซเชฏเซ.
เชฒเซเชเชฎเชพเช เชธเชพเชงเชจเซเชจเชพ GNU เชธเชเชธเซเชเชฐเชฃเซเชจเซ เชเชชเชฏเซเช เชเชฐเชตเชพเชฎเชพเช เชเชตเซเชฏเซ เชนเชคเซ.
เชชเซเชฐเชฅเชฎ, เชเชพเชฒเซ เชเซเชเช เชเซ เช เชเชฆเซเชถเซ เชถเซเช เชเชฐเซ เชเซ.
เชคเซ เชกเซเชเชฐ เชชเซเชฒ เชถเชพ เชฎเชพเชเซ เชตเชชเชฐเชพเชฏ เชเซ? เช
เชจเซเชธเชพเชฐ
"เชฐเชเชฟเชธเซเชเซเชฐเซเชฎเชพเชเชฅเซ เชเชฌเซ เช เชฅเชตเชพ เชฐเซเชชเซเชเซเชเชฐเซ เชเซเชเชเซ".
เชคเซเชฏเชพเช เชเชชเชฃเชจเซ เชคเซเชจเซ เชฒเชฟเชเช เชชเชฃ เชฎเชณเซ เชเซ
เช
เชนเซเชเชฅเซ เชเชชเชฃเซ เชธเชฎเชเซ เชถเชเซเช เชเซเช เชเซ เชกเซเชเชฐ เชเชฎเซเช เช เชเซเชเซเชเชธ เชธเซเชคเชฐเซเชจเซ เชธเชฎเซเชน เชเซ เชเซเชฎเชพเช เชเชฎเซเชเชฎเชพเช เชจเชตเซเชจเชคเชฎ เชซเซเชฐเชซเชพเชฐเซ เชตเชฟเชถเซเชจเซ เชฎเชพเชนเชฟเชคเซ เชนเซเชฏ เชเซ, เชเซ เชฆเซเชเซเชคเซ เชฐเซเชคเซ เช เชเชชเชฃเชจเซ เชเซเชเช เชเซ. เชเชเชณ เชเชชเชฃเซ เชเซเชเช เชเซเช
เชคเซ เชจเซเชเซ เชฎเซเชเชฌ เชเชนเซ เชเซ:
"เชเช "เชเชฎเซเช" เช 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