1 octombrie 2019 / docker

Docker compose este un instrument excelent pentru a gestiona containerele docker si faciliteaza actualizarea containerelor folosind ultimele etichete de imagini. Cu toate acestea, operatia simpla de tragere si inaltare -d, desi este convenabila, nu ofera optiuni usoare de atenuare daca o imagine actualizata rupe un container. Acest articol se va concentra asupra modului de implementare a acestor pasi de atenuare, astfel incat daca ceva nu merge bine in timpul unei actualizari, se poate reveni cu usurinta la ultima stare de lucru.

Probleme cu cea mai recenta eticheta

Cei mai multi pasionati de docker si utilizatori de intreprindere va vor spune ca utilizarea celor mai recente etichete in imaginile docker nu este o practica buna. Vedeti articolul nostru de pe blog intitulat „Pericolele de a trage: cel mai recent” pentru mai multe informatii despre asta. Desi este adevarat, utilizarea celei mai recente etichete face mult mai usor sa pastrati containerele la zi pentru utilizatorii casnici. Avand in vedere faptul ca LinuxServer.io elibereaza imagini noi nu numai atunci cand exista o actualizare a aplicatiei, ci si atunci cand exista actualizari ale pachetelor de sistem de operare, pot exista actualizari frecvente la imaginile noastre. Desigur, nimeni nu s-ar certa impotriva actualizarii pachetelor de sisteme de operare din punct de vedere al securitatii. Cu toate acestea, faptul ca trebuie sa actualizati manual etichetele de imagine docker in compunerea eamelor de fiecare data cand exista o actualizare a imaginii ar necesita un angajament semnificativ in timp si nu este foarte practic sau posibil in lumea reala. Ca majoritatea utilizatorilor nostri, imi imaginez,

Exista diverse motive pentru care o actualizare a containerelor poate merge gresit. Imaginile noi pot avea probleme sau versiunile noi de aplicatii sau pachete pot sa nu fie compatibile cu datele existente (imaginile noastre sunt construite si publicate automat si, desi Jenkins nostru face anumite teste pe noua imagine inainte de publicare, nu sunt foarte extinse si nu acopera actualizarea cu date existente). In prezent, atunci cand o actualizare sparge lucrurile, recomandarea noastra este sa ne intoarcem la eticheta anterioara. In cele mai multe cazuri, utilizatorul nu are idee de imaginea anterioara pe care o foloseau (intrucat le cunoaste doar de cea mai recenta eticheta, mai degraba decat de etichetele versate). Asadar, ar trebui sa sape prin listarile de etichete de pe Docker Hub si sa incerce etichete cu versiuni mai vechi si sa vada daca vreuna dintre ele functioneaza. Aceasta nu numai ca consuma timp, ci necesita si un grad mai mare de cunoastere a Docker Hub si a conceptului de eticheta.

Scripturi copii de rezerva si actualizari

Voi impartasi cu voi un set de scripturi cu care am venit pentru a atenua aceasta problema, astfel incat o comanda poate face backup la date, actualiza containerele, o alta comanda pentru a reveni la starea de lucru anterioara si alta pentru a relua actualizarile la cele mai recente. Sa incepem mai intai cu componentele si conceptele individuale si vom pune la capat intregul scenariu la sfarsit.

Conceptul de actualizare

Inainte de a actualiza containerele, trebuie sa pastram starea actuala de lucru. Exista trei componente pentru ca:

  • Date despre aplicatie (/ folder de configurare si orice alt folder mapat care trebuie sa fie persistent)
  • Imagine Docker (eticheta specifica pentru imaginea pe care se bazeaza in prezent containerul nostru)
  • Docker compune yaml

Cu aceste trei componente, putem crea o replica exacta a containerelor noastre de lucru actuale.

Conceptul de backup

Datele aplicatiei pot fi salvate prin tar si stocate intr-un fisier de arhiva pe aceeasi masina sau o masina de la distanta. Datele aplicatiei pot fi, de asemenea, transferate catre o alta masina prin rsync sau orice alt protocol de copiere. In acest caz, vom folosi o arhiva de gudron, dar nu ezitati sa inlocuiti propria metoda.

Repo digerati

Obtinerea etichetei specifice a imaginii curente este un proces in doi pasi. Mai intai trebuie sa interogam eticheta de imagine locala prin docker inspect –format = ‘{{.Image}}’ <container_name>. Apoi, folosim acea eticheta locala de imagine pentru a interoga repozitia repetata a imaginii, ceea ce ne va permite sa tragem aceeasi imagine din Docker Hub: docker inspect –format = ‘{{index .RepoDigests 0}}’ <local_image_tag>. Acest lucru va scuti un repo digest care arata ca linuxserver / mariadb @ sha256: 1986f7bd4c842931b830be2f7ac03fcb8d2a83be3c7784cf1471d0d8938a4487, ceea ce va indica imaginea curenta pe care o foloseste containerul nostru pe Docker Hub, pentru a putea sa o tragem mai tarziu, daca este nevoie.

Salvarea dockerului pentru a compune yaml este la fel de simpla ca copierea si redenumirea fisierului in locatia noastra de rezerva pentru referinta noastra ulterior.

Odata ce acesti trei pasi sunt finalizati, scriptul nostru poate efectua cu succes operatiunile de tragere si trecere in sus pentru a actualiza containerele noastre, deoarece am pastrat informatiile critice necesare pentru a recrea exact ultima noastra stare de lucru.

Restaurati conceptul

Daca se rupe ceva, putem restabili ultima stare de lucru cu urmatorii pasi:

  • Opriti si indepartati recipientele
  • Restaurati datele aplicatiei din copie de rezerva (netarit sau rsync inapoi)
  • Editati docker-ul pentru a compune yaml pentru a inlocui imaginea: instructiunile de eticheta cu digerarea repo pe care am salvat-o in timpul actualizarii
  • Efectuati pull-up -d pentru a crea containere pe baza ultimelor imagini de lucru si cu datele aplicatiei copiate

Relueaza conceptul

Dupa cum puteti vedea, yaml-ul nostru de compozitie indica acum etichete de imagine specifice (repetitii) ale ultimelor imagini de lucru, mai degraba decat cele mai recente, astfel incat operatia pull / up -d nu va mai actualiza imaginile la cele mai recente. Acest lucru inseamna ca scriptul nostru va avea nevoie si de o functie de reluare pentru a reveni la ultimele imagini, dupa ce am confirmat ca problemele care au rezultat in pauza sunt atenuate.

Construirea scriptului

Premisele si ipotezele scriptului

Acum sa incercam sa plasam intreaga structura intr-un script oarecum automatizat. Dar mai intai, sa stabilim cateva premise si presupuneri:

  • Acest script va presupune ca exista un singur docker care compune yaml care gestioneaza diverse servicii
  • Datele aplicatiei pentru toate containerele se afla sub un singur folder dedicat (de ex. / Home / user / appdata)
  • Pentru o automatizare completa, vom solicita instalarea yq, astfel incat sa analizam docker-ul sa compuna yaml si sa regasim numele serviciului si ale containerului. Puteti instala yq prin sudo snap install yq sau alte metode descrise aici. In mod alternativ, vom include o metoda pentru a introduce manual numele de container si de imagine in script daca nu puteti sau nu doriti sa instalati yq.

Iata structura folderului care functioneaza cu acest script:

Variabilele de utilizator

Mai intai vom seta variabilele definite de utilizator:

  • APPDATA_LOC = “/ home / user / appdata”, acest lucru va va spune scriptul unde se afla folderul de date al aplicatiei
  • COMPOSE_LOC = “/ home / user / docker-compose.yml”, acest lucru va spune scriptul unde se afla docker-ul care compune yaml
  • Apoi scriptul nostru va descoperi unde sa salveze versiunile de imagini prin VERSIONS_LOC = “$ {APPDATA_LOC} /versions.txt” (Nu schimbati acest lucru)

functii

Apoi, vom crea 3 functii care pot fi numite extern (actualizare, restaurare si reluare) si vom executa scriptul dupa cum se numeste:

actualizare functie {} restaurare functie {} reluare functie {} # Verificati daca functia exista daca declarati -f “$ 1”> / dev / null; apoi „$ @” ecou altfel ”Singurele argumente valide sunt actualizarea, restaurarea si reluarea„ iesirea 1 fi

Functia de actualizare

Dupa cum am mentionat mai sus, functia noastra de actualizare va face trei lucruri: 1) salvati versiunile, 2) faceti o copie de siguranta a datelor aplicatiei si 3) actualizati imaginile si recreati containere.

In primul rand, sa ne asiguram ca yq este instalat:

ecou „Cautare yq” daca care yq; apoi ecuati „yq gasit, continuand„ altul ecou ”Va rugam sa instalati mai intai yq„ iesirea 1 fi

Iata cum ne dam seama si salvam versiunile:

daca [ ! -f “$ VERSIONS_LOC”]; apoi pentru i in configuratia $ (docker-compose -f “$ COMPOSE_LOC”); face container_name = $ (yq r “$ COMPOSE_LOC” servicii. “$ {i}”. container_name) image_name = $ (docker inspect –format = ‘{{index .Config.Image}}’ “$ container_name”) repo_digest = $ (docker inspect –format = ‘{{index .RepoDigests 0}}’ $ (docker inspect –format = ‘{{.Image}}’ “$ container_name”)) echo “$ container_name, $ image_name, $ repo_digest “>>” $ VERSIONS_LOC “a facut altceva mv” $ VERSIONS_LOC “” $ {VERSIONS_LOC} .bak “pentru i in $ (pisica” $ {VERSIONS_LOC} .bak “); do container_name = $ (ecou “$ i” | awk -F, ‘{print $ 1}’) image_name = $ (ecou “$ i” | awk -F, ‘{print $ 2}’) repo_digest = $ (docker inspect – -format =“

Daca aceasta este prima operatie de actualizare, tragem imaginile si etichetele originale (cele mai recente) de la compunerea yaml-ului, daca nu, le tragem de la versions.txt care a fost salvata data trecuta. Acest lucru se datoreaza faptului ca, odata ce functia de restaurare este executata, pierdem imaginile originale de la compunerea yaml. In acest fel, le pastram in versiunile.txt pentru a fi utilizate in timpul CV-ului.

In esenta, aceasta parte a scriptului preia si salveaza 3 bucati de informatii pentru fiecare container in valori separate de virgula, cate o linie pentru fiecare container:

  1. numele containerului,
  2. numele si eticheta imaginii originale si
  3. repetare a imaginii curente.

Va arata asa:

MariaDB, linuxserver / MariaDB, linuxserver / MariaDB @ SHA256: 1986f7bd4c842931b830be2f7ac03fcb8d2a83be3c7784cf1471d0d8938a4487 WordPress, linuxserver / nginx, linuxserver / nginx @ SHA256: 40a929941fca10e2b38fe9575409eabb21fa3569a59c2de6ece1068dc27a7292 letsencrypt, linuxserver / letsencrypt, linuxserver / letsencrypt @ SHA256: 566386b5762721c36643103f882db70dfda9c4d2441133e40e754ae22f2db734

Aceasta versiune.txt va fi stocata in folderul de date al aplicatiei, astfel incat sa poata fi salvata alaturi de datele aplicatiei.

Metoda alternativa fara yq

Daca nu putem sau nu dorim sa instalam yq, in schimb, putem defini numele containerului si imaginilor noastre in script. Putem merge mai departe si sa comentam cele doua sectiuni de mai sus, cea care verifica yq si cea care scrie versiunile.txt si utilizam in schimb urmatorul cod:

CONTAINERS = (\ letsencrypt, linuxserver / letsencrypt \ mariadb, linuxserver / mariadb \ phpmyadmin, phpmyadmin / phpmyadmin \) pentru i in “$ {CONTAINERS [@]}”; do container_name = $ (ecou “$ i” | awk -F, ‘{print $ 1}’) image_name = $ (ecou “$ i” | awk -F, ‘{print $ 2}’) repo_digest = $ (docker inspect – -format = ‘{{index .RepoDigests 0}}’ $ (docker inspect –format = ‘{{.Image}}’ “$ container_name”)) echo “$ container_name, $ image_name, $ repo_digest” >> “$ VERSIONS_LOC “terminat

Puteti introduce toate numele de container si de imagine in formatul de mai sus, separate prin virgula, fara spatii si un container pe linie.

Continuarea functiei de actualizare

Desi al doilea pas in actualizare este copierea de rezerva a folderului de date pentru aplicatii, trebuie mai intai sa oprim containerele care ruleaza. De asemenea, imi place sa actualizez imaginile inainte de oprirea containerelor pentru a reduce timpul de reducere a containerului, deoarece procesul de actualizare a imaginilor poate dura o perioada semnificativa de timp pentru imagini mai mari si / sau pentru conexiuni lente.

sudo docker-compose -f “$ COMPOSE_LOC” trageti docker-compose -f “$ COMPOSE_LOC” in jos

Apoi salvam o copie a docker-ului nostru, alcatuind yaml in folderul de date al aplicatiei si o rezerva.

APPDATA_NAME = $ (ecou “$ APPDATA_LOC” | awk -F / ‘{print $ NF}’) cp -a “$ COMPOSE_LOC” “$ APPDATA_LOC” /docker-compose.yml.bak sudo tar-C “$ APPDATA_LOC” / .. -cvzf “$ APPDATA_LOC” /../ appdatabackup.tar.gz “$ APPDATA_NAME”

Acest lucru va crea un dosar appdatabackup.tar.gz din folderul nostru de date despre aplicatii. Apoi, cream containerele noi imediat ce se finalizeaza backup-ul (pentru a minimiza timpul de inactivitate), apoi remediem permisiunile noastre si eliminam imaginile vechi ale docului:

docker-compose -f “$ COMPOSE_LOC” sus -d sudo chown “$ {USER}”: “$ {USER}” “$ APPDATA_LOC” /../ websitebackup.tar.gz imaginea docker prune -f

Acum ne-am actualizat imaginile si containerul, dar am pastrat, de asemenea, toate informatiile necesare pentru a recrea ultima noastra stare de lucru intr-o arhiva de gudron.

Restaurati functia

Mai intai oprim si eliminam containerele existente:

sudo docker-compose -f “$ COMPOSE_LOC” in jos

Apoi mutam / redenumim folderul de date al aplicatiei (potential rupt), aplicandu-l cu un sir de 8 cifre aleatoriu (pentru referinta):

randstr = $ (</ dev / urandom tr -dc _A-Zaz-0-9 | head -c $ {1: -8}; ecou;) mv “$ APPDATA_LOC” “$ {APPDATA_LOC}. $ randstr” cp – un “$ COMPOSE_LOC” “$ {COMPOSE_LOC}. $ randstr”

Acum putem restaura folderul de date pentru aplicatii din backup:

mkdir -p “$ APPDATA_LOC” sudo tar xvf “$ APPDATA_LOC” /../ websitebackup.tar.

porno gratis cu animale http://wilmingtonsouth.net/__media__/js/netsoltrademark.php?d=adult69.ro/
filme porno cu mature bune http://sodexocms.com/__media__/js/netsoltrademark.php?d=adult69.ro/
filme porno femei in varsta http://seattlecourtreporters.net/__media__/js/netsoltrademark.php?d=adult69.ro/
sportive porno http://khireiwish.com/__media__/js/netsoltrademark.php?d=adult69.ro/filme-porno/amatori
filme porno cu fetite http://marybethbyers.com/__media__/js/netsoltrademark.php?d=adult69.ro/filme-porno/anal
filme porno cur mare http://www.vaxinnate.us/__media__/js/netsoltrademark.php?d=adult69.ro/filme-porno/asiatice
loredana chivu porno http://whelentexas.com/__media__/js/netsoltrademark.php?d=adult69.ro/filme-porno/beeg
filme porno cu scolarite http://www.onacorp.us/__media__/js/netsoltrademark.php?d=adult69.ro/filme-porno/blonde
big ass porno http://anderssondyke.com/__media__/js/netsoltrademark.php?d=adult69.ro/filme-porno/brazzers
mom tube porno http://wpsdtv.biz/__media__/js/netsoltrademark.php?d=adult69.ro/filme-porno/brunete
vidio porno gratis mature http://www.brainpopedia.com/__media__/js/netsoltrademark.php?d=adult69.ro/filme-porno/chaturbate
porno deucxma http://www.deeannhenderson.com/__media__/js/netsoltrademark.php?d=adult69.ro/sora-se-relaxeaza-in-baie-cu-pula-fratelui
profesoare porno http://neurocrine.info/__media__/js/netsoltrademark.php?d=adult69.ro/brunetele-inghit-sperma-de-la-aceeasi-pula-mare
porno mather http://diamondsbytheinch.com/__media__/js/netsoltrademark.php?d=adult69.ro/bruneta-superba-geme-de-placerea-pulii-iubitului-ei
lisa ann porno http://cougarcapitalpartners.com/__media__/js/netsoltrademark.php?d=adult69.ro/femeie-matura-obtine-o-ejaculare-extrema-pe-fata
free porno hub http://iciciholdingsltd.com/__media__/js/netsoltrademark.php?d=adult69.ro/curva-cu-experienta-este-fututa-brututal-in-pizda-rasa
filme porno mamici rusoaice http://burelli.com/__media__/js/netsoltrademark.php?d=adult69.ro/sex-salbatic-intre-adolescenti-amatori
filme porno cu maimute http://daneddy.com/__media__/js/netsoltrademark.php?d=adult69.ro/pizda-blondei-cu-tatele-mari-e-calarita-de-o-pula-groasa
doar porno gratis http://heklalimited.com/__media__/js/netsoltrademark.php?d=adult69.ro/asistenta-fierbinte-primeste-limbi-in-pizda
filme porno cu ejacuari http://schwartzberglaw.org/__media__/js/netsoltrademark.php?d=adult69.ro/lezbienele-se-fut-cel-mai-bine-afara

gz -C “$ APPDATA_LOC” /../

Si putem citi digeratiile de repozitie ale imaginii care functioneaza anterior din fisierul versions.txt pe care l-am salvat inainte si sa modificam docker-ul nostru compun yaml pentru a trage acele imagini:

pentru eu in $ (pisica „$ VERSIONS_LOC”); do image_name = $ (ecou “$ i” | awk -F, ‘{print $ 2}’) repo_digest = $ (ecou “$ i” | awk -F, ‘{print $ 3}’) sed -i “s # imagine : $ {image_name} #image: $ {repo_digest} #g “” $ COMPOSE_LOC “terminat

Acum ca am restabilit ultimele date ale aplicatiei de lucru si am specificat ultimele etichete de imagine de lucru, putem crea containerele noastre pentru a restabili ultima noastra stare de lucru:

docker-compose -f “$ COMPOSE_LOC” trageti docker-compose -f “$ COMPOSE_LOC” sus -d

Functia de reluare

Dupa ce suntem pregatiti sa revenim la cele mai recente etichete si sa reluam actualizarile, putem rula urmatoarea functie care citeste numele si etichetele originale ale imaginii si le vom pune in componenta noastra yaml:

pentru eu in $ (pisica „$ VERSIONS_LOC”); do image_name = “$ (ecou $ i | awk -F, ‘{print $ 2}’)” repo_digest = “$ (ecou $ i | awk -F, ‘{print $ 3}’)” sed -i “s # imagine : $ {repo_digest} #image: $ {image_name} #g “” $ COMPOSE_LOC “terminat

Apoi tragem imaginile si recream containerele:

docker-compose -f “$ COMPOSE_LOC” trageti docker-compose -f “$ COMPOSE_LOC” sus -d

Dupa acest punct, functia de actualizare va continua sa traga cele mai noi imagini.

Script complet

Mai jos este scenariul complet. Trebuie doar sa modificati primele doua variabile pentru a spune script-ul unde se afla folderul de date pentru aplicatii si yaml-ul de compunere. Apoi, puteti rula functiile adaugand numele scriptului. Am numit scriptul meu de gestionare, astfel incat sa pot emite ./manage update, ./manage restore sau ./manage CV (nu uitati sa chmod + x gestionati inainte de executare).

#! / bin / bash # Schimba variabilele aici: APPDATA_LOC = “/ home / user / docker” COMPOSE_LOC = “/ home / user / docker-compose.yml” # Nu schimbati variabilele de mai jos decat daca doriti sa personalizati scriptul VERSIONS_LOC = “$ {APPDATA_LOC} /versions.txt” actualizare functie {echo “Cautare yq” daca yq; apoi ecuati “yq gasit, continuand” altul ecou “Va rugam sa instalati mai intai yq” iesiti 1 fi daca [! -f “$ VERSIONS_LOC”]; apoi pentru i in configuratia $ (docker-compose -f “$ COMPOSE_LOC”); face container_name = $ (yq r “$ COMPOSE_LOC” servicii. “$ {i}”. container_name) image_name = $ (docker inspect –format = ‘{{index .Config.Image}}’ “$ container_name”) repo_digest = $ (docker inspect –format = ‘{{index .RepoDigests 0}}’ $ (docker inspect –format = ‘{{.Image}}’ “$ container_name”)) ecou “$ container_name, $ image_name, $ repo_digest” >> “$ VERSIONS_LOC” facut altceva mv “$ VERSIONS_LOC” “$ {VERSIONS_LOC} .bak” pentru i in $ (pisica “$ {VERSIONS_LOC}. bak “); do container_name = $ (ecou “$ i” | awk -F, ‘{print $ 1}’) image_name = $ (ecou “$ i” | awk -F, ‘{print $ 2}’) repo_digest = $ (docker inspect – -format = ‘{{index .RepoDigests 0}}’ $ (docker inspect –format = ‘{{.Image}}’ “$ container_name”)) echo “$ container_name, $ image_name, $ repo_digest” >> “$ VERSIONS_LOC “terminat rm” $ {VERSIONS_LOC} .bak “fi # Metoda alternativa care nu necesita yq. Comenteaza randurile 11-34 daca activezi aceasta metoda. # CONTAINERS = (\ # letsencrypt, linuxserver / letsencrypt \ # mariadb, linuxserver / mariadb \ # phpmyadmin, phpmyadmin / phpmyadmin \ #) # pentru i in „$ {CONTAINERS [@]}”; do # container_name = $ (ecou “$ i” | awk -F, ‘{print $ 1}’) # image_name = $ (ecou “$ i” | awk -F, ‘{print $ 2}’) # repo_digest = $ ( docker inspect –format = ‘{{index .RepoDigests 0}}’ $ (docker inspect –format = ‘{{.Image}}’ “$ container_name”)) # echo “$ container_name, $ image_name, $ repo_digest” >> “$ VERSIONS_LOC” #done sudo docker-compose -f “$ COMPOSE_LOC” trageti docker-compose -f “$ COMPOSE_LOC” in jos APPDATA_NAME = $ (ecou “$ APPDATA_LOC” | awk -F / ‘{print $ NF}’ ) cp -a “$ COMPOSE_LOC” “$ APPDATA_LOC” /docker-compose.yml.bak sudo tar -C “$ APPDATA_LOC” / .. -cvzf “$ APPDATA_LOC” /../ appdatabackup.tar.gz ”