แฉแแแ แแแฅแแแแ 2 แขแแแแ แ แแแแแฎแ, 75 แแแกแแแแแแแก แขแแแแแขแ unix แแแ แแแ, แแแแแ แแก แกแแชแแแ แแ แแแแแ แแก แแแแแแกแ แแ แแแแแ แแฃแจแแก แแ แซแแแแแแแแก แแแแฎแแ แชแแแแแแแก แแแแแแแแ แแแแแ แแแแแแขแแก แแแ แแจแ.
UPD:
แแแแฎแแ: แ แแกแแแแก แแ แแก แแก แงแแแแแคแแ แ?
แแแกแฃแฎแ: แแ แแแฃแฅแขแแก แแแขแแแ แแแแก แขแแกแขแแ แแแ (แแ แแแแแแงแแแแแ bash, แกแแ แแแขแแแ แแแฌแแแแแฃแแแ แกแแแแแแแแแแแแแแ แแแแแแแแกแแแแก). แแแแแฌแงแแ, แ แแ แแ แแแแแแงแแแแแแแ แแแแแ แแแแแแขแ แแแแแขแแแแแ แคแแแแแแก แจแแกแแแชแแ แแแแแ (แแแแแแ แฃแแ แแแแแขแแแแก แคแแ แแแแแจแ) แแ, แจแแกแแแแแแกแแ, แฃแคแ แ แแแฆแแแ แแแขแแแ แแแแก แแแฃแแแชแแ. แจแแแแแแ, Docker แแแแแแขแแก แกแแกแขแแแแก แงแแแแ แจแแคแแ แฎแแแ แแแแฎแกแแ. แจแแแแ แแแแ แกแฃแคแแ แแแขแแแ แแแ แแแแแฆแแ แแแ แแแแแ แแ แแแฃแฅแขแแ.
แกแขแแขแแแจแ แแแแแงแแแแแฃแแ แแงแ แแแกแขแ แฃแแแแขแแแแก GNU แแแ แกแแแแ.
แแแ แแแแ, แแแแแ แแแแ แแแแแ, แ แแก แแแแแแแแ แแก แแ แซแแแแแแแ.
แแแจ, แ แแกแแแแก แแแแแแงแแแแแ docker pull? แฒแแฎแแแแแ
"แแแแแแฆแแ แกแฃแ แแแ แแ แกแแชแแแ แ แแแกแขแ แแแแ".
แแฅ แฉแแแ แแกแแแ แแแแฃแแแแ แแแฃแแก
แแฅแแแแ แจแแแแแซแแแ แแแแแแแ, แ แแ แแแแแ แแก แแแแแกแแฎแฃแแแแ แแ แแก แแแ แแแแฃแแ แคแแแแแแก แแแแ แแแ, แ แแแแแแช แจแแแชแแแก แแแคแแ แแแชแแแก แแแแแกแแฎแฃแแแแแก แฃแแฎแแแกแ แชแแแแแแแแแแก แจแแกแแฎแแ, แ แแช แแจแแแ แแ แแแญแแ แแแแ. แจแแแแแ แฉแแแ แแฃแงแฃแ แแแ
แแแกแจแ แแแแฅแแแแแ แจแแแแแแ:
"แกแฃแ แแแ" แแ แแก 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}
แจแแแแแ แกแ-แกแแแ แซแ: {แคแแแแก แแแแ}
แจแแแแแ แกแ-แขแแแ: แแแแแแแชแแ/แแฅแขแแขแ-แแแแแแ
แคแแแแก แแ แแแแแ แแแแแชแแแแแ". - แแขแแแ แแแแ 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 save c24fe13d37b9 -o savedArch
แแแฎแกแแแแ แแแฆแแแฃแแ แแ แฅแแแ แแแแแแแแ แ แแแ แแฅแขแแ แแแจแ
tar xvf savedArch
แ แแแแ แช แฎแแแแแ, แแแแแแฃแแ แกแแแแจแแแแ แฎแแแ แชแแแแ แกแแฅแแฆแแแแแจแแ. แแฎแแ แแแแแแฎแแแแ แฉแแแ แแแแ แแแฆแแแฃแแ แแแแแคแแกแขแแก แกแขแ แฃแฅแขแฃแ แแก
cat manifest.json | json_pp
แฒแ แช แแกแ แแแแ แ. แแแแฎแแ, แ แ แแแแแคแแกแขแแ แกแแญแแ แ แฉแแขแแแ แแแแก แแแฎแแแแแ
แชแฎแแแแ, แแ แกแแแฃแแ แแแแแคแแกแขแ แฉแแแแแแแก แแ แฏแแแแ, แแแแขแแ แฉแแแ แกแแแฃแแแ แแแแก แแแแแแแแแแ แแแแฅแฏแแแแกแ แแ แแฃแ แขแแแแแแแแก, แแแจแแแแแแแกแ แแ แแแแคแแแฃแ แแชแแแแแ.
แฉแแแ แงแแแแแแแแก แแแแฅแแแแ แแแแแแฃแ แแ แแ แแแแคแแแฃแ แแชแแแก แคแแแแ แแ แกแแชแแชแฎแแแก แฎแแแแแแก แแแกแแแ. แกแฅแแแแก แแแ แกแแ 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