āĻāĻŽāĻžāĻĻā§āĻ° āĻāĻžāĻā§ 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}"āĨ¤
āĻāĻŋāĻ¨ā§āĻ¤ā§ āĻĄāĻā§āĻŽā§āĻ¨ā§āĻā§āĻļāĻ¨ āĻāĻāĻāĻŋ āĻ§āĻžāĻĒ āĻŽāĻŋāĻ¸ āĻāĻ°ā§, āĻ¯āĻž āĻāĻžāĻĄāĻŧāĻž āĻāĻŋāĻā§āĻ āĻāĻžāĻ āĻāĻ°āĻŦā§ āĻ¨āĻžāĨ¤ āĻāĻāĻā§āĻāĻŋāĻ¯āĻŧāĻž āĻ˛ā§āĻĄāĻŋāĻāĻ¯āĻŧā§āĻ° āĻāĻ¨ā§āĻ¯, āĻĒāĻžāĻļāĻžāĻĒāĻžāĻļāĻŋ āĻāĻāĻļāĻŋāĻ (āĻāĻŖā§āĻĄāĻŋāĻ¤) āĻāĻ¨ā§āĻ¯, āĻ°ā§āĻ˛ āĻ˛ā§āĻĄ āĻāĻ°āĻžāĻ° āĻāĻā§, āĻāĻĒāĻ¨āĻžāĻā§ āĻ āĻŦāĻļā§āĻ¯āĻ āĻāĻāĻāĻŋ āĻĒā§āĻ¯āĻžāĻ āĻ āĻ¨ā§āĻ°ā§āĻ§ āĻāĻ°āĻ¤ā§ āĻšāĻŦā§:
"āĻĒā§āĻ¯āĻžāĻ /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