Te whakatinana i nga whakahau kumea me nga whakahau pana docker me te kore he kiritaki docker e whakamahi ana i nga tono HTTP

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.

Te whakatinana i nga whakahau kumea me nga whakahau pana docker me te kore he kiritaki docker e whakamahi ana i nga tono HTTP

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 tuhinga:

"Toia he ahua, he putunga ranei mai i te rehita".

I reira hoki ka kitea he hononga ki mohio ki nga whakaahua, ipu, me nga taraiwa rokiroki.

Te whakatinana i nga whakahau kumea me nga whakahau pana docker me te kore he kiritaki docker e whakamahi ana i nga tono HTTP

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 API rēhita.

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"

Te whakatinana i nga whakahau kumea me nga whakahau pana docker me te kore he kiritaki docker e whakamahi ana i nga tono HTTP

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

Te whakatinana i nga whakahau kumea me nga whakahau pana docker me te kore he kiritaki docker e whakamahi ana i nga tono HTTP

Kia kite tatou he aha te ahua o te konae i riro i a tatou hei raina ora tuatahi.

file firstLayer

Te whakatinana i nga whakahau kumea me nga whakahau pana docker me te kore he kiritaki docker e whakamahi ana i nga tono HTTP

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 tuhinga. No reira me tango e tatou ia rangatira, kohia te whakaaturanga e tika ana, ka tango ano hoki. He ahua ngawari.

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

Te whakatinana i nga whakahau kumea me nga whakahau pana docker me te kore he kiritaki docker e whakamahi ana i nga tono HTTP

Inaianei me penapena e te rohe mo etahi atu tātaritanga

docker save c24fe13d37b9 -o savedArch

Te whakatinana i nga whakahau kumea me nga whakahau pana docker me te kore he kiritaki docker e whakamahi ana i nga tono HTTP

Wewetehia te purongo ka puta ki te whaiaronga o naianei

tar xvf savedArch

Te whakatinana i nga whakahau kumea me nga whakahau pana docker me te kore he kiritaki docker e whakamahi ana i nga tono HTTP

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

Te whakatinana i nga whakahau kumea me nga whakahau pana docker me te kore he kiritaki docker e whakamahi ana i nga tono HTTP

Kaore i nui. Kia kite tatou he aha te whakaaturanga e hiahiatia ana hei uta, e ai ki tuhinga.

Te whakatinana i nga whakahau kumea me nga whakahau pana docker me te kore he kiritaki docker e whakamahi ana i nga tono HTTP

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

Tāpiri i te kōrero