E 2 a matou peeke tarutaru, 75 mescaline papa unix taiao, he putunga putunga me te mahi ki te whakatinana i nga whakahau kumea me nga whakahau pana docker me te kore he kiritaki docker.
UPS:
Patai: He aha enei mea katoa?
Whakautu: Utahia te whakamatautau o te hua (KORE te whakamahi i te bash, ka whakaratohia nga tuhinga mo nga kaupapa ako). I whakatauhia kia kaua e whakamahi i te kiritaki docker ki te whakaheke i etahi atu paparanga (i roto i nga rohe whaitake), a, na reira, ka whai i te kawenga teitei ake. Ko te mutunga mai, i tangohia nga whakaroa o te punaha a te kiritaki Docker. I whakawhiwhia e matou he kawenga ahua ma ki runga i te hua.
I whakamahia e te tuhinga nga momo taputapu GNU.
Tuatahi, kia mohio tatou he aha enei whakahau.
Na he aha te mahi a te kume docker? E ai ki
"Toia he ahua, he putunga ranei mai i te rehita".
I reira hoki ka kitea he hononga ki
Mai i konei ka mohio tatou ko te ahua docker he huinga o etahi paparanga kei roto nga korero mo nga huringa hou o te ahua, ko te mea e hiahiatia ana e tatou. I muri mai ka titiro tatou
Ko te korero e whai ake nei:
"Ko te "ahua" he huinga o te whakaaturanga JSON me nga konae paparanga takitahi. Ko te tukanga o te toia he > atahanga ka huri ki te tiki i enei waahanga e rua."
Na ko te taahiraa tuatahi e ai ki nga tuhinga ko "Te toia he Whakaaturanga Atahanga".
Ko te tikanga, kaore matou e kopere, engari me hiahia nga raraunga mai i a ia. He tauira tono e whai ake nei: GET /v2/{name}/manifests/{reference}
"Ko te ingoa me te tawhā tohutoro e tohu ana i te ahua me te mea e hiahiatia ana. Ko te tohutoro pea he tohu, he keri ranei."
Ko ta maatau whare putunga docker kua tukuna ki te rohe, me ngana ki te whakatutuki i te tono:
curl -s -X GET "http://localhost:8081/link/to/docker/registry/v2/centos-11-10/manifests/1.1.1" -H "header_if_needed"
Hei whakautu, ka whiwhi tatou i te json mai i a maatau e aro noa ana ki nga raina ora, me o raatau tohu. Ka riro mai i a raatau, ka taea e taatau te haere ki ia waahanga ka mahia te tono e whai ake nei: "TIKI /v2/{ingoa}/blobs/{digest}"
"Ko te urunga ki tetahi paparanga ka kutihia e te ingoa o te putunga engari he mea motuhake i roto i te rehita ma te keri."
i roto i tenei take ko te hash i riro mai i a matou.
Whakamatau ana
curl -s -X GET "http://localhost:8081/link/to/docker/registry/v2/centos-11-10/blobs/sha256:f972d139738dfcd1519fd2461815651336ee25a8b54c358834c50af094bb262f" -H "header_if_needed" --output firstLayer
Kia kite tatou he aha te ahua o te konae i riro i a tatou hei raina ora tuatahi.
file firstLayer
aua. Ko nga reera he putunga tar, ka wetewete i a raatau i roto i te raupapa tika ka whiwhi tatou i nga mea o te ahua.
Me tuhi he tuhi bash iti kia taea ai enei mea katoa te mahi aunoa
#!/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
Inaianei ka taea e taatau te whakahaere me nga tawhā e hiahiatia ana ka whiwhi i nga ihirangi o te ahua e hiahiatia ana
./script.sh dirName “http://localhost:8081/link/to/docker/registry” myAwesomeImage 1.0
Wāhanga 2 - pana waka
Ka iti ake te uaua o tenei.
Me timata ano
I muri i te ako i nga tuhinga, ka taea e tatou te wehewehe i te tukanga tango kia maha nga waahanga:
- Tukatuka arawhiti - "POST /v2/{repoName}/blobs/uploads/"
- Te tuku ake i tetahi raina ora (ka whakamahia e matou he tukunga monolithic, ara ka tukuna katoatia e matou ia raina ora) - "PUT /v2/{repoName}/blobs/uploads/{uuid}?digest={digest}
Ihirangi-Roa: {rahi o te paparanga}
Momo-Ihirangi: tono/octet-stream
Raraunga-rua Apa". - Kei te uta i te whakaaturanga - "PUT /v2/{repoName}/manifests/{reference}".
Engari ka ngaro nga tuhinga i tetahi taahiraa, kaore he mea e mahi. Mo te utaina monolithic, me te waahanga (taapiri), i mua i te utaina o te reriwe, me mahi he tono PATCH:
"PATCH /v2/{repoName}/blobs/uploads/{uuid}
Ihirangi-Roa: {rahi o te wahi}
Momo-Ihirangi: tono/octet-stream
{Layer Chunk Binary Data}".
Ki te kore, kare e taea e koe te neke atu i te waahi tuatahi, na te mea... Engari i te waehere whakautu e tumanakohia ana 202, ka whiwhi koe i te 4xx.
Inaianei te ahua o te algorithm:
- Whakauru
- Rerei papaki
- Te uta i te arai
- Te uta i te whakaaturanga
Ko nga tohu 2 me te 3, ka tuaruatia i nga wa e tika ana kia utaina te maha o nga rarangi.
Tuatahi, me hiahia tetahi ahua. Ka whakamahi ahau i te archlinux:hou
docker pull archlinux
Inaianei me penapena e te rohe mo etahi atu tātaritanga
docker save c24fe13d37b9 -o savedArch
Wewetehia te purongo ka puta ki te whaiaronga o naianei
tar xvf savedArch
Kei te kite koe, kei roto i te kōpaki motuhake ia raina ora. Inaianei ka titiro tatou ki te hanganga o te whakaaturanga i riro mai i a tatou
cat manifest.json | json_pp
Kaore i nui. Kia kite tatou he aha te whakaaturanga e hiahiatia ana hei uta, e ai ki
Ma te maarama, kaore e pai te whakaaturanga o naianei ki a maatau, na reira ka mahia e maatau me te blackjack me nga kooti, nga raina ora me nga whirihora.
Kia kotahi pea te konae whirihora me te huinga o nga raina ora. Putanga Aronui 2 (kei te wa e tuhi ana), ka waiho te MediaType kia kore e huri:
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
I muri i te hanga i te whakaaturanga taketake, me whakakiia e koe ki nga raraunga whaimana. Hei mahi i tenei, ka whakamahia e matou te tauira json o te ahanoa rerewe:
{
"mediaType": "application/vnd.docker.image.rootfs.diff.tar.gzip",
"size": ${layersSizes[$i]},
"digest": "sha256:${layersNames[$i]}"
},
Ka taapirihia e matou ki te whakaaturanga mo ia reriwe.
I muri mai, me rapu tatou i te rahi o te konae whirihora me te whakakapi i nga stubs i roto i te whakaaturanga me nga raraunga tuuturu
sed -i "s/config_size/$configSize/g; s/config_hash/$configName/g" $manifestFile
Inaianei ka taea e koe te tiimata i te mahi tango me te penapena i a koe he uuid, me whai i nga tono katoa ka whai ake.
He penei te ahua o te tuhinga katoa:
#!/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
ka taea e tatou te whakamahi i te tuhinga kua rite:
./uploadImage.sh "~/path/to/saved/image" "http://localhost:8081/link/to/docker/registry" myRepoName 1.0
UPS:
He aha nga hua i riro mai?
Tuatahi, ko nga raraunga tuuturu mo te tātari, na te mea ka whakahaerehia nga whakamatautau i roto i te blazemeter me nga raraunga mo nga tono a nga kaihoko docker kaore i te tino korero, kaore i rite ki nga tono HTTP parakore.
Tuarua, na te whakawhitinga i taea e matou te whakanui ake i te maha o nga kaiwhakamahi mariko mo te tukunga mai i te docker ma te 150% me te tere ake o te wa whakautu 20-25%. Mo te tango a docker, i kaha taatau ki te whakanui ake i te maha o nga kaiwhakamahi ma te 500%, i te wa i heke te wa whakautu mo te 60%.
Mauruuru koe mo tou whakarongo.
Source: will.com