ααΎαααΆααααα 2 ααΆα 75 ααααΆαα mescaline unix ααα·ααααΆα ααααΆαα docker αα·αααΆααα·α αα α’αα»ααααααΆααααααααΆ docker pull αα·α docker push αααααααΆααααΆαααΈαααααα docker α
UPSα
αααα½αα ααΎααΆααα’ααααααααααΆααα’αααΈ?
α
ααααΎαα αααα»αααΆαααααΎαααααααα·ααα (αα·αααααΎααΆααα ααααααΈαααααΌαααΆααααααααΌααααααΆαααααααααα’αααα)α ααΆααααΌαααΆααααααα
α
α·ααααα·αααααΎαααΆαααΈαααααα docker ααΎααααΈααΆααααααααααααΆαααααααα (αααα»αααααααααααα ααα»αα) α αΎαααΆαααα ααααΎααααΆααααΆαααΆααααα»ααααααααΆααααα ααΆαααααα ααΆααααααΆααααααααααααααΆααα’αααααααααΆαααΈαααααα Docker ααααΌαααΆαααα
ααα ααΎαααΆαααα½αααααα»αααα’αΆααααααααΆαααα
ααΎααα·αααα
α’αααααααΆαααααΎαααα GNU ααα§αααααα
ααΆααααΌα α αΌαααΎαααααααααααΆααΎααΆααααααααΆααΆαααααααααΎα’αααΈα
ααΌα
ααααααΎ docker pull ααααΎαααααΆααα’αααΈ? αααβαα
βααΆα
"ααΆαααΌαααΆα α¬ααααΆααααΈαααααΈααααα"α
αα
ααΈαααααΎαααααααΎααααααααΆαααα
ααΈααΈααα ααΎαα’αΆα
αααααΆαααΆ ααΌαααΆα docker ααΊααΆαααα»ααααααααΆαααα½αα
ααα½ααααααΆαααααααΆαα’αααΈααΆαααααΆααααααΌαα
α»αααααααααα»ααα
αααα»αααΌαααΆα αααα
αααΆααααΆα’αααΈαααααΎαααααΌαααΆαα αααααΆααααΎαααΎα
ααΆαα·ααΆαααΌα ααΆααααααα
"ααΌαααΆα" ααΊααΆααΆααα½ααααα αΌαααααΆαα JSON manifest αα·αα―αααΆααααααΆααααΈαα½ααα ααααΎαααΆαααααΆαααΆα > ααΌαααΆαααααααα»ααα·αααΆαααΆααααααΆαααΆαα»ααΆααααΈααααα"
ααΌα ααααααα αΆαααααΌαααααα ααΆαα―αααΆαααΊ "ααΆαααΆαααΆααααα αΆαααΌαααΆα"α
ααΆααΆααα·αααΆαα ααΎαααΉααα·αααΆααααΆαα ααα»ααααααΎαααααΌαααΆααα·ααααααααΈααΆα ααΆαβαααααβαααβααΊβααΆβααααΎβα§ααΆα αααα GET /v2/{name}/manifests/{reference}
"ααααα αα·ααααΆαααΆααααααααααααααα’ααααααααΆαααΌαααΆα α αΎαααααΌαααΆαααΆαααΆαα α―αααΆααααα’αΆα αα½ααααα αΌαααααΆα α¬ααααααα"
ααααΆαα docker ααααααΎαααααΌαααΆαααΆαααααααΆααααα»ααααα»α ααΌαααααΆααΆαα’αα»ααααααααΎα
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}"
"ααΆαα αΌααα ααΆαααααααΆαααα½αααΉαααααΌαααΆααα·αααααααααααααααΆαα ααα»ααααααααΌαααΆααααααα’ααααααααΆααααα½αααααα αααα»ααααααΈααααααααααΆαααααααα"
digest αααα»αααααΈαααααΊααΆ hash αααααΎαααΆαααα½αα
αααα»αααααΆααΆα
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
ααΆαααααα ααααΌαααααααΎαααΊααΆααααααΆα tar ααααααααΆαα½αααΆααΆαααααΆααααααααααΎαααΉαααα½αααΆαααΆαα·ααΆααααΌαααΆαα
α αΌαααΎααααααααααααΈα bash ααΌα αα½αααΎααααΈα±ααα’αααΈαααΆααα’αααααα’αΆα ααααΎαααΆααααααααααααααααα·
#!/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 - ααΆααα»α docker
αααααΉαααΆαααΆααααα»αααααΆαααααα·α α
αααα
αΆααααααΎααααααααααΆαα½α
αααααΆααααΈαα·ααααΆα―αααΆααα½α ααΎαα’αΆα αααα ααααααΎαααΆαααΆαααααΆααα αΆαααΆα αααΎαα
- ααΆαα αΆααααααΎαααααΎαααΆα - "POST /v2/{repoName}/blobs/uploads/"
- ααΆααααα αααααααααααΆααααΈαα·α (ααΎαααΉαααααΎααΆααααα αα monolithic αααααΊ ααΎαααααΎααααααΈαα·αααΈαα½ααααΆαααααα»α) - "PUT /v2/{repoName}/blobs/uploads/{uuid}?digest={digest}
ααααααααααΉαααΆαα {ααα ααααααΆαα}
ααααααααΆαα·ααΆα αααααα·ααΈ/octet-stream
αααααΆαααα·αααααααααααΈα"α - αααα»ααααα»α manifest - "PUT /v2/{repoName}/manifests/{reference}"α
ααα»ααααβα―αααΆαβαααβααααΆαβαα½αβααα αΆα αααβααααΆαβα’αααΈβααΉαβααααΎαααΆαβα‘αΎαα αααααΆααααΆααααα»α monolithic ααααΌα ααΆαααααΆααααααααααα (ααααΆαα) αα»αααααααα»αααααΌαααα α’αααααααΌαααα’αα»ααααααααΎ PATCHα
"PATCH /v2/{repoName}/blobs/uploads/{uuid}
ααααααααααΉαααΆαα {ααα αααααΆαα}
ααααααααΆαα·ααΆα αααααα·ααΈ/octet-stream
{Layer Chunk Binary Data}"α
ααΎαα·αααΌα αααααα α’αααααΉααα·αα’αΆα α α½αααΈα ααα»α ααΈαα½αααΆααα ααααα... αααα½αα±αααααααΌαααααΎααααααααααΉααα»α 202 α’αααααΉαααα½αααΆα 4xx α
α₯α‘αΌαααααααα½ααααααααΆαααΎααα ααΌα ααα:
- ααΆαα αΆααααααΎα
- ααααΌαααααααα
- αααα»ααααα»ααα
- αααα»ααααα»α manifest
α ααα»α ααΈ 2 αα·αααΈ 3 ααΉαααααΌαααααΎαααααααα αααΎαααααΆαα ααα½ααααααΆαααααααααΌααααα»αα
ααααΌαααΎαααααΌαααΆαααΌαααΆαααΆαα½αα αααα»αααΉαααααΎ archlinux:latest
docker pull archlinux
α₯α‘αΌααααααΌααααααΆαα»αααΆαα αααα»αααΌαααααΆααααααΆααααΆααα·ααΆααααααα
docker save c24fe13d37b9 -o savedArch
αααααΆαααααααΆααααααααα αααα»ααααα αα α»αααααα
tar xvf savedArch
ααΌα αααα’αααα’αΆα ααΎαααααααΈαα·αααΈαα½αααααα·ααα αααα»αααααΆα ααααα‘αααα½αα α₯α‘αΌααααααΌαααΎααα ααΆαααααααααα manifest αααααΎαααΆαααα½α
cat manifest.json | json_pp
αα·αβα
αααΎαα αααααΎαα’αααΈααα manifest ααααΌαααΆαααΎααααΈαααα»α αααααΎαααααΆα
ααΆααααααα ααΆααααα αΆααααααΆαααααΆαααα·αααααΉαααΎααα ααΌα ααααααΎαααΉααααααΎαααααααα½αα―αααΆαα½αααΉα blackjack αα·α courtesans, lifelines αα·α configs α
ααΎααααααααΆαα―αααΆαααααααα ααΆαααααααααααΆαα αα ααΆαααα½α αα·αα’αΆααααααααααΈαα·αα αααααααΆααααααα 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
αααααΆααααΈαααααΎα manifest ααΌαααααΆα α’αααααααΌααααααααΆααΆαα½αααΉααα·ααααααααααΉαααααΌαα ααΎααααΈααααΎααΌα αααααΎαααααΎααααΌ json ααααααα»ααααΌααααα
{
"mediaType": "application/vnd.docker.image.rootfs.diff.tar.gzip",
"size": ${layersSizes[$i]},
"digest": "sha256:${layersNames[$i]}"
},
ααΎαααΉαααααααααΆαα manifest αααααΆααααααΌαααααααΎαααΈαα½ααα
αααααΆαααα ααΎαααααΌααααααααααα αααα―αααΆαααααααα ααΆαααααααα α αΎααααα½α stubs αααα»α manifest ααΆαα½ααα·αααααααα·α
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
UPSα
ααΎααΎαααα½αααΆαααααααα’αααΈ?
ααΈαα½α αα·αααααααα·αααααΆαααααααΆααααΆααα·ααΆα α
αΆααααΆααααΈααΆαααααΎαααααααααΌαααΆαααααΎαααΆααα
αααα»α blazemeter α αΎααα·αααααααα
ααΎααααΎααααα’αα·αα·αα docker ααΊαα·αααΆαααααααΆαα
αααΎααα αα·αααΌα
ααααΎ HTTP αα»ααααααααα
ααΈααΈα ααΆαααααΆααααααΌαααΆαα’αα»ααααΆαα±ααααΎααααααΎαα ααα½αα’αααααααΎααααΆαααα·αααα·ααααααΆααααΆααααα αα docker αααα αα 150% αα·αααα½αααΆααααααααΆααααΎαααααΆααααα 20-25% ααΏαααΆααα»αα αααααΆααααΆαααΆααα docker ααΎαααΆααααααααααααΎααααΈαααααΎαα ααα½αα’αααααααΎααααΆαα 500% αααααααααααααΆααααΎαααααΆαααααααΆαααα α»ααααα αα 60%α
ααΌαα’ααα»αα ααααααΆαααα α·ααααα»αααΆααααααα’αααα
ααααα: www.habr.com