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.
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
"Toso se ata poʻo se fale teu oloa mai se resitala".
O iina tatou te maua ai foi se sootaga i
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
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"
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
Se'i tatou va'ai po'o le a le ituaiga faila na i'u ina maua o le laina ola muamua.
file firstLayer
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
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
Ia tatou sefe i le lotoifale mo nisi auiliiliga
docker save c24fe13d37b9 -o savedArch
Tatala le fa'amaumauga o lo'o maua i totonu o le lisi o lo'o iai nei
tar xvf savedArch
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
E le tele. Sei o tatou vaʻai poʻo le a le faʻaaliga e manaʻomia e utaina, e tusa ai
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