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