Fa'atinoina o fa'atonuga o le toso ma le fa'atosina e aunoa ma se tagata fa'atau e fa'aaoga talosaga HTTP

E 2 a matou taga mutia, 75 mescaline tablets unix environment, se fale teu oloa ma le galuega o le faʻatinoina o le faʻatonuga o le toso ma le faʻatonuga e aunoa ma se tagata faʻatau.

Fa'atinoina o fa'atonuga o le toso ma le fa'atosina e aunoa ma se tagata fa'atau e fa'aaoga talosaga HTTP

FUAFUAGA:
Fesili: O le ā le aogā o nei mea uma?
Tali: utaina le suʻega o le oloa (E LE faʻaaogaina le bash, o loʻo tuʻuina atu tusitusiga mo faʻamoemoega aʻoaʻoga). Na fa'ai'uga e aua ne'i fa'aogaina le tagata fa'atau fa'atau e fa'aitiitia ai fa'aputuga fa'aopoopo (i totonu o tapula'a talafeagai) ma, e tusa ai, fa'aa'oa'o i se uta maualuga. O le i'uga, na aveesea uma fa'atuai faiga a le kalani Docker. Na matou mauaina se uta mama sa'o i luga o le oloa.
O le tusiga na faʻaaogaina GNU versions of tools.

Muamua, se'i tatou iloa po o le a le mea e fai e nei poloaiga.

O le a la le mea o loʻo faʻaogaina ai le toso a le docker? Ae faimai foi fa'amaumauga:

"Toso se ata poʻo se fale teu oloa mai se resitala".

O iina tatou te maua ai foi se sootaga i malamalama i ata, koneteina, ma avetaavale teuina.

Fa'atinoina o fa'atonuga o le toso ma le fa'atosina e aunoa ma se tagata fa'atau e fa'aaoga talosaga HTTP

Mai iinei e mafai ona tatou malamalama ai o le docker image o se seti o ni vaega o loʻo i ai faʻamatalaga e uiga i suiga lata mai i le ata, e manino lava o mea tatou te manaʻomia. Sosoo ai ona tatou tilotilo i ai resitala API.

O loo faapea mai:

"O se" ata "o se tuufaatasiga o se JSON faʻaaliga ma faila faila taʻitasi.

O lea la o le laasaga muamua e tusa ai ma faʻamaumauga o le "Toso o se Ata Fa'aaliga".

Ioe, matou te le fanaina, ae matou te manaʻomia faʻamatalaga mai ai. Ole fa'ata'ita'iga ole talosaga lea: GET /v2/{name}/manifests/{reference}

"O le igoa ma le fa'ailoga fa'asino e iloa ai le ata ma e mana'omia.

O loʻo faʻapipiʻiina le matou fale teu oloa i le lotoifale, seʻi o tatou taumafai e faʻatino le talosaga:

curl -s -X GET "http://localhost:8081/link/to/docker/registry/v2/centos-11-10/manifests/1.1.1" -H "header_if_needed"

Fa'atinoina o fa'atonuga o le toso ma le fa'atosina e aunoa ma se tagata fa'atau e fa'aaoga talosaga HTTP

I le tali atu, matou te mauaina le json lea matou te fiafia ai i le taimi nei i laina ola, poʻo a latou faʻailoga. O le mauaina o ia mea, e mafai ona tatou faʻaogaina taʻitasi ma faʻatino le talosaga lenei: "GET /v2/{name}/blobs/{digest}"

"O le ulufale atu i se laulau o le a faʻailogaina i le igoa o le fale teu oloa ae e faʻamaonia tulaga ese i le resitala e ala i le digest."

digest i lenei tulaga o le hash na matou mauaina.

Tatou taumafai

curl -s -X GET "http://localhost:8081/link/to/docker/registry/v2/centos-11-10/blobs/sha256:f972d139738dfcd1519fd2461815651336ee25a8b54c358834c50af094bb262f" -H "header_if_needed" --output firstLayer

Fa'atinoina o fa'atonuga o le toso ma le fa'atosina e aunoa ma se tagata fa'atau e fa'aaoga talosaga HTTP

Se'i tatou va'ai po'o le a le ituaiga faila na i'u ina maua o le laina ola muamua.

file firstLayer

Fa'atinoina o fa'atonuga o le toso ma le fa'atosina e aunoa ma se tagata fa'atau e fa'aaoga talosaga HTTP

i latou. Rails o fa'amaumauga ta, unpacking i latou i le faasologa talafeagai o le a tatou maua mea o loʻo i totonu o le ata.

Se'i o tatou tusia se tama'i bash script ina ia mafai ai ona fa'autometi nei mea uma

#!/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

Ole taimi nei e mafai ona tatou faʻataʻitaʻiina ma faʻamaufaʻailoga manaʻomia ma maua mea o loʻo i totonu o le ata manaʻomia

./script.sh dirName “http://localhost:8081/link/to/docker/registry” myAwesomeImage 1.0

Vaega 2 - tu'i fa'atau

O le a fai si lavelave teisi.

Tatou toe amata i fa'amaumauga. O lea e manaʻomia ai ona tatou sii maia taʻitaʻi taʻitoʻatasi, aoina le faʻaaliga tutusa ma laʻu mai ai foi. E foliga faigofie.

A maeʻa suʻesuʻega faʻamaumauga, e mafai ona tatou vaevaeina le faagasologa o le download i ni laasaga:

  • Fa'asologa amata - "POST /v2/{repoName}/blobs/uploads/"
  • Tu'u i luga o se laina ola (o le a matou fa'aogaina se fa'apipi'i monolithic, o lona uiga matou te tu'uina atu laina ola ta'itasi i lona atoaga) - "PUT /v2/{repoName}/blobs/uploads/{uuid}?digest={digest}
    Isi-Uumi: {le tele o le laulau}
    Ituaiga-Ituaiga: talosaga/octet-stream
    Layer Binary Data".
  • Tu'uina le fa'aaliga - "PUT /v2/{repoName}/manifests/{reference}".

Ae o faʻamaumauga e misia se laasaga e tasi, a aunoa ma se mea e leai se mea e aoga. Mo le utaina o le monolithic, faʻapea foʻi ma le vaega (chunked), aʻo leʻi utaina le nofoaafi, e tatau ona e faia se talosaga PATCH:

"PATCH /v2/{repoName}/blobs/uploads/{uuid}
Mataupu-Uumi: {le tele o fasi mea}
Ituaiga-Ituaiga: talosaga/octet-stream
{Layer Chunk Binary Data}".

A leai, o le a le mafai ona e alu i tua atu o le vaega muamua, aua... Nai lo le faʻamoemoeina tali tali 202, o le ae mauaina 4xx.

O lea la o le algorithm e foliga mai:

  • Amataina
  • Patch rail
  • O lo'o utaina le fa'amau lima
  • Tu'uina le fa'aaliga
    Fa'ailoga 2 ma le 3, o le a toe faia i le tele o taimi e mana'omia ai le utaina o le numera o laina.

Muamua, matou te manaʻomia soʻo se ata. O le a ou faʻaaogaina archlinux: lata mai

docker pull archlinux

Fa'atinoina o fa'atonuga o le toso ma le fa'atosina e aunoa ma se tagata fa'atau e fa'aaoga talosaga HTTP

Ia tatou sefe i le lotoifale mo nisi auiliiliga

docker save c24fe13d37b9 -o savedArch

Fa'atinoina o fa'atonuga o le toso ma le fa'atosina e aunoa ma se tagata fa'atau e fa'aaoga talosaga HTTP

Tatala le fa'amaumauga o lo'o maua i totonu o le lisi o lo'o iai nei

tar xvf savedArch

Fa'atinoina o fa'atonuga o le toso ma le fa'atosina e aunoa ma se tagata fa'atau e fa'aaoga talosaga HTTP

E pei ona e vaʻai, o laina ola taʻitasi o loʻo i totonu o se pusa eseese. Se'i o tatou tilotilo la i le fausaga o le faaaliga na tatou mauaina

cat manifest.json | json_pp

Fa'atinoina o fa'atonuga o le toso ma le fa'atosina e aunoa ma se tagata fa'atau e fa'aaoga talosaga HTTP

E le tele. Sei o tatou vaʻai poʻo le a le faʻaaliga e manaʻomia e utaina, e tusa ai fa'amaumauga.

Fa'atinoina o fa'atonuga o le toso ma le fa'atosina e aunoa ma se tagata fa'atau e fa'aaoga talosaga HTTP

E manino lava, o le faʻaaliga o loʻo i ai nei e le fetaui ma i matou, o lea o le a matou faia a matou lava mea i blackjack ma courtesans, laina ola ma configs.

O le a i ai i taimi uma a itiiti ifo ma le tasi le faila config ma le tele o laina ola. Fa'ata'ita'iga version 2 (o lo'o iai i le taimi na tusia ai), mediaType o le a tu'u pea e le suia:

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

A maeʻa ona fatuina le faʻaaliga autu, e tatau ona e faʻatumu i faʻamatalaga aoga. Ina ia faia lenei mea, matou te faʻaogaina le json template o le mea o le nofoaafi:

{
         "mediaType": "application/vnd.docker.image.rootfs.diff.tar.gzip",
         "size": ${layersSizes[$i]},
         "digest": "sha256:${layersNames[$i]}"
      },

O le a matou faʻaopoopoina i le faʻaaliga mo nofoaafi taʻitasi.

Le isi, e manaʻomia ona tatou suʻeina le tele o le faila faila ma sui le stubs i le faʻaaliga ma faʻamatalaga moni

sed -i "s/config_size/$configSize/g; s/config_hash/$configName/g" $manifestFile

Ole taimi nei e mafai ona e amataina le faʻagasologa o le download ma faʻasaoina oe i se uuid, lea e tatau ona faʻatasi ma talosaga uma mulimuli ane.

O le tusitusiga atoa e pei o lenei:

#!/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

e mafai ona tatou faʻaogaina se tusitusiga ua uma ona fai:

./uploadImage.sh "~/path/to/saved/image" "http://localhost:8081/link/to/docker/registry" myRepoName 1.0

FUAFUAGA:
O le a le mea na tatou maua ona o se taunuuga?
Muamua, o faʻamatalaga moni mo auʻiliʻiliga, talu ai o suʻega o loʻo faʻatautaia i le blazemeter ma o faʻamaumauga i luga o talosaga a le au faifaʻailoga e le o faʻamatalaga tele, e le pei o talosaga HTTP mama.

Lona lua, o le suiga na mafai ai ona matou faʻateleina le numera o tagata faʻaoga faʻapitoa mo le faʻapipiʻiina o le docker e tusa ma le 150% ma maua ai le taimi tali 20-25% vave. Mo docker download, na mafai ona matou faʻateleina le numera o tagata faʻaoga i le 500%, aʻo faʻaititia le taimi tali e tusa ma le 60%.

Faafetai mo lou mafaufau.

puna: www.habr.com

Faaopoopo i ai se faamatalaga