{"id":96065,"date":"2020-10-07T13:42:09","date_gmt":"2020-10-07T11:42:09","guid":{"rendered":"https:\/\/prohoster.info\/blog\/administrirovanie\/problema-umnoj-ochistki-obrazov-kontejnerov-i-eyo-reshenie-v-werf"},"modified":"2020-10-07T13:42:09","modified_gmt":"2020-10-07T11:42:09","slug":"problema-umnoj-ochistki-obrazov-kontejnerov-i-eyo-reshenie-v-werf","status":"publish","type":"post","link":"https:\/\/prohoster.info\/ro\/blog\/administrirovanie\/problema-umnoj-ochistki-obrazov-kontejnerov-i-eyo-reshenie-v-werf","title":{"rendered":"Problema \u201einteligent\u0103\u201d a cur\u0103\u021b\u0103rii imaginilor containerelor \u0219i solu\u021bia acesteia \u00een werf","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"Problema \u201einteligent\u0103\u201d a cur\u0103\u021b\u0103rii imaginilor containerelor \u0219i solu\u021bia acesteia \u00een werf\" src=\"\/wp-content\/uploads\/2020\/10\/1410cea46bb8dcdc3ac06db11ed5a402.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nArticolul abordeaz\u0103 problematica cur\u0103\u021b\u0103rii imaginilor care se acumuleaz\u0103 \u00een registrele containerelor (Docker Registry \u0219i omologii s\u0103i) \u00een contextul pipeline-urilor CI\/CD actuale pentru aplica\u021bii cloud native livrate \u00een Kubernetes. Sunt prezentate principalele criterii de actualitate a imaginilor \u0219i dificult\u0103\u021bile care decurg din acestea \u00een automatizarea cur\u0103\u021b\u0103rii, economisirea spa\u021biului \u0219i satisfacerea nevoilor echipelor. \u00cen final, vom ar\u0103ta, prin exemplul unui proiect Open Source specific, cum pot fi dep\u0103\u0219ite aceste dificult\u0103\u021bi.<\/p>\n<h2>Introducere<\/h2>\n<p>\nNum\u0103rul imaginilor din registrul containerelor poate cre\u0219te rapid, ocup\u00e2nd mai mult spa\u021biu de stocare \u0219i, \u00een consecin\u021b\u0103, cresc\u00e2nd semnificativ costul acestuia. Pentru a controla, limita sau men\u021bine o cre\u0219tere acceptabil\u0103 a spa\u021biului ocupat \u00een registry, este obi\u0219nuit s\u0103:<\/p>\n<ol>\n<li>folose\u0219ti un num\u0103r fix de etichete pentru imagini;<\/li>\n<li>cur\u0103\u021bi imaginile \u00een vreun fel.<\/li>\n<\/ol>\n<p><noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><br \/>\nPrima limitare este uneori acceptabil\u0103 pentru echipe mici. Dac\u0103 dezvoltatorilor le sunt suficiente etichetele permanente (<code>latest<\/code>, <code>main<\/code>, <code>test<\/code>, <code>boris<\/code> etc.), registrul nu se va extinde ca volum \u0219i o lung\u0103 perioad\u0103 de timp nu va fi necesar s\u0103 te g\u00e2nde\u0219ti la cur\u0103\u021bare. Toate imaginile neactualizate sunt \u00eenlocuite, a\u0219a c\u0103 nu r\u0103m\u00e2ne munc\u0103 de cur\u0103\u021bare (totul se face de c\u0103tre colectorul standard de de\u0219euri).<\/p>\n<p>Cu toate acestea, aceast\u0103 abordare limiteaz\u0103 semnificativ dezvoltarea \u0219i este rar aplicabil\u0103 \u00een CI\/CD pentru proiectele moderne. O parte integrant\u0103 a dezvolt\u0103rii a devenit <strong>automatizarea<\/strong>, care permite testarea, desf\u0103\u0219urarea \u0219i livrarea mai rapid\u0103 a noilor func\u021bionalit\u0103\u021bi utilizatorilor. De exemplu, \u00een toate proiectele noastre, la fiecare commit se creeaz\u0103 automat un pipeline CI. Aici se construie\u0219te imaginea, se testeaz\u0103, se lanseaz\u0103 \u00een diverse medii Kubernetes pentru debugging \u0219i verific\u0103ri suplimentare, iar dac\u0103 totul este \u00een regul\u0103 \u2014 modific\u0103rile ajung la utilizatorul final. \u0218i aceasta nu mai este o \u0219tiin\u021b\u0103 a rachetelor, ci o cotidian\u0103 pentru mul\u021bi \u2014 probabil \u0219i pentru tine, av\u00e2nd \u00een vedere c\u0103 cite\u0219ti acest articol.<\/p>\n<p>Deoarece eliminarea bug-urilor \u0219i dezvoltarea de noi func\u021bionalit\u0103\u021bi se desf\u0103\u0219oar\u0103 \u00een paralel, iar lans\u0103rile pot avea loc de mai multe ori pe zi, este evident c\u0103 procesul de dezvoltare este \u00eenso\u021bit de un num\u0103r semnificativ de commit-uri, ceea ce \u00eenseamn\u0103 \u2014 <strong>un num\u0103r mare de imagini \u00een registry.<\/strong>Ca urmare, apare cu urgen\u021b\u0103 problema organiz\u0103rii unei cur\u0103\u021b\u0103ri eficiente a registry-ului, adic\u0103 eliminarea imaginilor neactualizate.<\/p>\n<p>Dar cum putem determina dac\u0103 imaginea este relevant\u0103?<\/p>\n<h2>Criteriile de relevan\u021b\u0103 a imaginii<\/h2>\n<p>\n\u00cen cele mai multe cazuri, principalele criterii vor fi urm\u0103toarele:<\/p>\n<p>1. Primul (cel mai evident \u0219i cel mai critic dintre toate) \u2014 sunt imaginile care <strong>\u00een prezent sunt utilizate \u00een Kubernetes<\/strong>. Eliminarea acestor imagini poate duce la costuri serioase din cauza timpului de nefunc\u021bionare a produc\u021biei (de exemplu, imaginile pot fi necesare pentru replicare) sau poate anula eforturile echipei responsabile cu depanarea \u00een oricare dintre medii. <i>(Din acest motiv, am creat chiar un <\/i><noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/flant\/k8s-image-availability-exporter\"><i>exportator Prometheus<\/i><\/a><\/noindex><i>, care monitorizeaz\u0103 absen\u021ba acestor imagini \u00een oricare cluster Kubernetes.)<\/i><\/p>\n<p>2. Al doilea (mai pu\u021bin evident, dar totu\u0219i foarte important \u0219i din nou legat de exploatare) \u2014 imaginile care <strong>sunt necesare pentru restaurare \u00een cazul identific\u0103rii problemelor serioase<\/strong> \u00een versiunea curent\u0103. De exemplu, \u00een cazul Helm, acestea sunt imaginile utilizate \u00een versiunile salvate ale lans\u0103rii. (Apropo, implicit \u00een Helm exist\u0103 o limit\u0103 de 256 de revizuiri, dar cineva are \u00eentr-adev\u0103r nevoie de salvarea <i>a\u0219a de<\/i> multor versiuni?..) Totu\u0219i, noi, printre altele, p\u0103str\u0103m versiuni pentru a le putea utiliza ulterior, adic\u0103 pentru a putea \"revine\" la ele \u00een caz de necesitate.<\/p>\n<p>3. Al treilea \u2014 <strong>nevoile dezvoltatorilor<\/strong>: toate imaginile legate de lucr\u0103rile lor curente. De exemplu, dac\u0103 examin\u0103m un PR, are sens s\u0103 l\u0103s\u0103m imaginea care corespunde ultimei modific\u0103ri \u0219i, s\u0103 zicem, modific\u0103rii anterioare: astfel, dezvoltatorul poate reveni rapid la orice sarcin\u0103 \u0219i lucra cu ultimele actualiz\u0103ri. <\/p>\n<p>4. Al patrulea \u2014 imaginile care <strong>corespund versiunilor aplica\u021biei noastre<\/strong>, adic\u0103 sunt produsul final: v1.0.0, 20.04.01, sierra etc.<\/p>\n<p>NB: Criteriile formulate aici au fost stabilite pe baza experien\u021bei de colaborare cu zeci de echipe de dezvoltare din diferite companii. Cu toate acestea, desigur, \u00een func\u021bie de particularit\u0103\u021bile proceselor de dezvoltare \u0219i de infrastructura utilizat\u0103 (de exemplu, \u00een cazul \u00een care nu se utilizeaz\u0103 Kubernetes), aceste criterii pot varia. <\/p>\n<h2>Conformitatea cu criteriile \u0219i solu\u021biile existente<\/h2>\n<p>\nServiciile populare cu registry de containere ofer\u0103, de obicei, propriile politici de cur\u0103\u021bare a imaginilor: \u00een acestea, pute\u021bi defini condi\u021biile \u00een care un tag este \u0219ters din registry. Totu\u0219i, op\u021biunile acestor condi\u021bii sunt limitate la parametrii precum numele, timpul de creare \u0219i num\u0103rul de taguri.<\/p>\n<p><i>* Depinde de implement\u0103rile specifice ale registrului de containere. Am analizat capabilit\u0103\u021bile urm\u0103toarelor solu\u021bii: Azure CR, Docker Hub, ECR, GCR, GitHub Packages, GitLab Container Registry, Harbor Registry, JFrog Artifactory, Quay.io \u2014 \u00eencep\u00e2nd cu septembrie 2020.<\/i><\/p>\n<p>Aceast\u0103 setare de parametri este suficient\u0103 pentru a \u00eendeplini cea de-a patra criteriu - adic\u0103 pentru a selecta imaginile care corespund versiunilor. Cu toate acestea, pentru toate celelalte criterii, trebuie s\u0103 alegem o solu\u021bie de compromis (o politic\u0103 mai strict\u0103 sau, dimpotriv\u0103, mai permisiv\u0103) - \u00een func\u021bie de a\u0219tept\u0103ri \u0219i posibilit\u0103\u021bile financiare.<\/p>\n<p>De exemplu, al treilea criteriu - legat de nevoile dezvoltatorilor - poate fi rezolvat prin organizarea proceselor \u00een interiorul echipelor: denumirea specific\u0103 a imaginilor, men\u021binerea unor liste de permisiuni speciale \u0219i acorduri interne. \u00cens\u0103, \u00een cele din urm\u0103, acesta trebuie automatizat. \u0218i dac\u0103 capacit\u0103\u021bile solu\u021biilor existente nu sunt suficiente, trebuie s\u0103 realiz\u0103m ceva propriu.<\/p>\n<p>Situa\u021bia este similar\u0103 cu cele dou\u0103 prime criterii: nu pot fi \u00eendeplinite f\u0103r\u0103 a ob\u021bine date dintr-un sistem extern - tocmai acela unde se desf\u0103\u0219oar\u0103 implementarea aplica\u021biilor (\u00een cazul nostru, acesta este Kubernetes).<\/p>\n<h3>Ilustrarea fluxului de lucru \u00een Git<\/h3>\n<p>\nS\u0103 presupunem c\u0103 lucra\u021bi aproximativ dup\u0103 acest model \u00een Git:<\/p>\n<p><img decoding=\"async\" alt=\"Problema \u201einteligent\u0103\u201d a cur\u0103\u021b\u0103rii imaginilor containerelor \u0219i solu\u021bia acesteia \u00een werf\" src=\"\/wp-content\/uploads\/2020\/10\/45c9bfb6755da1b4d6be05b51ab17429.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n<i>\u00cen diagram\u0103, cu iconi\u021ba capului sunt marcate imaginile containerelor care sunt \u00een prezent implementate \u00een Kubernetes pentru diferi\u021bi utilizatori (utilizatori finali, testeri, manageri etc.) sau folosite de dezvoltatori pentru depanare \u0219i scopuri similare.<\/i><\/p>\n<p>Ce se va \u00eent\u00e2mpla dac\u0103 politicile de cur\u0103\u021bare permit p\u0103strarea (ne\u0219tergerea) imaginilor doar <b>dup\u0103 numele de taguri specificate<\/b>?<\/p>\n<p><img decoding=\"async\" alt=\"Problema \u201einteligent\u0103\u201d a cur\u0103\u021b\u0103rii imaginilor containerelor \u0219i solu\u021bia acesteia \u00een werf\" src=\"\/wp-content\/uploads\/2020\/10\/e57ff24cb818799d28e8eb006aea2eb5.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nEste evident c\u0103 un astfel de scenariu nu va bucura pe nimeni.<\/p>\n<p>Ce se va schimba dac\u0103 politicile permit ne\u0219tergerea imaginilor <b>dup\u0103 un interval de timp specificat \/ num\u0103rul ultimelor comituri<\/b>?<\/p>\n<p><img decoding=\"async\" alt=\"Problema \u201einteligent\u0103\u201d a cur\u0103\u021b\u0103rii imaginilor containerelor \u0219i solu\u021bia acesteia \u00een werf\" src=\"\/wp-content\/uploads\/2020\/10\/7743581e6e64affb0a207ee156c00f6e.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nRezultatul a devenit semnificativ mai bun, totu\u0219i este \u00eenc\u0103 departe de ideal. Deoarece avem \u00een continuare dezvoltatori care au nevoie de imagini \u00een registry (sau chiar implementate \u00een K8s) pentru a depana bug-uri...<\/p>\n<p>Rezumatul situa\u021biei actuale de pe pia\u021b\u0103: func\u021biile disponibile \u00een registrele de containere nu ofer\u0103 suficient\u0103 flexibilitate \u00een ceea ce prive\u0219te cur\u0103\u021barea, iar motivul principal este <strong>lipsa posibilit\u0103\u021bii de interac\u021biune cu lumea exterioar\u0103<\/strong>. Deci, echipele care necesit\u0103 o astfel de flexibilitate trebuie s\u0103 implementeze singure \u0219tergerea imaginilor \"din exterior\", folosind Docker Registry API (sau API-ul nativ al implement\u0103rii respective).<\/p>\n<p>Cu toate acestea, noi am c\u0103utat o solu\u021bie universal\u0103, care s\u0103 automatizeze cur\u0103\u021barea imaginilor pentru diferite echipe care folosesc registre variate...<\/p>\n<h2>Drumul nostru c\u0103tre cur\u0103\u021barea universal\u0103 a imaginilor<\/h2>\n<p>\nDe unde provine aceast\u0103 necesitate? Faptul este c\u0103 nu suntem o echip\u0103 de dezvoltatori izolat\u0103, ci o echip\u0103 care sprijin\u0103 simultan mai multe asemenea grupuri, ajut\u00e2nd la solu\u021bionarea complet\u0103 a problemelor CI\/CD. Iar principalul instrument tehnic pentru aceasta este o unealt\u0103 Open Source <noindex><a rel=\"nofollow\" href=\"https:\/\/ru.werf.io\/\">werf<\/a><\/noindex>. Caracteristica sa este c\u0103 nu execut\u0103 o func\u021bie unic\u0103, ci sus\u021bine procesele de livrare continu\u0103 pe toate etapele: de la construire la implementare.<\/p>\n<p>Publicarea \u00een registrul* imaginilor (imediat dup\u0103 ce acestea sunt construite) este o func\u021bie evident\u0103 a unei astfel de unelte. \u0218i, deoarece imaginile sunt stocate acolo, iar dac\u0103 stocarea ta nu este nelimitat\u0103, trebuie s\u0103 te ocupi \u0219i de cur\u0103\u021barea ulterioar\u0103 a acestora. Despre cum am reu\u0219it s\u0103 avem succes \u00een acest sens, respect\u00e2nd toate criteriile impuse, voi vorbi \u00een continuare.<\/p>\n<p><i>* De\u0219i registrele \u00een sine pot fi diverse (Docker Registry, GitLab Container Registry, Harbor etc.), utilizatorii lor se confrunt\u0103 cu acelea\u0219i probleme. Solu\u021bia universal\u0103 \u00een cazul nostru nu depinde de implementarea registrului, deoarece este executat\u0103 \u00een afara registrelor \u0219i ofer\u0103 un comportament uniform pentru toate.<\/i><\/p>\n<p>De\u0219i folosim werf ca exemplu de implementare, sper\u0103m c\u0103 abord\u0103rile utilizate vor fi utile \u0219i altor echipe care se confrunt\u0103 cu dificult\u0103\u021bi similare.<\/p>\n<p>A\u0219adar, ne-am ocupat de <i>implementarea extern\u0103<\/i> a unui mecanism de cur\u0103\u021bare a imaginilor \u2014 \u00een locul posibilit\u0103\u021bilor care sunt deja integrate \u00een registrele de containere. Primul pas a fost utilizarea Docker Registry API pentru a crea acelea\u0219i politici primitive referitoare la num\u0103rul de etichete \u0219i timpul de creare a acestora (men\u021bionate mai sus). Acestea au fost completate cu <strong>o list\u0103 permisiv\u0103 bazat\u0103 pe imaginile utilizate \u00een infrastructura desf\u0103\u0219urat\u0103<\/strong>, adic\u0103 Kubernetes. Pentru acesta, a fost suficient s\u0103 parcurgem toate resursele implementate prin API-ul Kubernetes \u0219i s\u0103 ob\u021binem o list\u0103 de valori. <code>imagine<\/code>.<\/p>\n<p>Aceast\u0103 solu\u021bie trivial\u0103 a rezolvat cea mai critic\u0103 problem\u0103 (criteriul nr. 1), dar a fost doar \u00eenceputul c\u0103l\u0103toriei noastre pentru \u00eembun\u0103t\u0103\u021birea mecanismului de cur\u0103\u021bare. Urm\u0103torul \u2014 \u0219i mult mai interesant \u2014 pas a fost solu\u021bia <strong>de a lega imaginile publicate de istoricul Git<\/strong>.<\/p>\n<h3>Scheme de etichetare<\/h3>\n<p>\nLa \u00eenceput, am ales o abordare \u00een care imaginea final\u0103 trebuia s\u0103 stocheze informa\u021biile necesare pentru cur\u0103\u021bare, \u0219i am construit procesul pe baza schemelor de etichetare. La publicarea imaginii, utilizatorul a ales o anumit\u0103 op\u021biune de etichetare (<code>git-branch<\/code>, <code>git-commit<\/code> sau <code>git-tag<\/code>) \u0219i a folosit valoarea corespunz\u0103toare. \u00cen sistemele CI, setarea acestor valori a fost realizat\u0103 automat pe baza variabilelor de mediu. Practic <strong>imaginea final\u0103 a fost legat\u0103 de un anumit element Git<\/strong>, p\u0103str\u00e2nd datele necesare pentru cur\u0103\u021bare \u00een etichete.<\/p>\n<p>\u00cen cadrul acestei abord\u0103ri, a rezultat un set de politici care permitea utilizarea Git ca singur\u0103 surs\u0103 de adev\u0103r:<\/p>\n<ul>\n<li>La \u0219tergerea unei ramuri\/tag \u00een Git, imaginile legate erau \u0219terse automat din registry.<\/li>\n<li>Num\u0103rul de imagini asociat cu taguri \u0219i commit-uri Git putea fi reglat \u00een func\u021bie de num\u0103rul de taguri utilizate \u00een schema aleas\u0103 \u0219i de momentul cre\u0103rii commit-ului asociat.<\/li>\n<\/ul>\n<p>\n\u00cen general, implementarea rezultat\u0103 satisface nevoile noastre, dar cur\u00e2nd ne a\u0219tepta o nou\u0103 provocare. Problema era c\u0103, \u00een timpul utiliz\u0103rii schemelor de etichetare pe baza elementelor Git, ne-am confruntat cu o serie de dezavantaje. <i>(Deoarece descrierea lor dep\u0103\u0219e\u0219te tema acestui articol, to\u021bi cei interesa\u021bi pot consulta detalii <\/i><noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/flant\/blog\/495112\/\"><i>aici<\/i><\/a><\/noindex><i>.)<\/i> Prin urmare, dup\u0103 ce am decis s\u0103 trecem la o abordare mai eficient\u0103 de etichetare (etichete pe baz\u0103 de con\u021binut), a trebuit s\u0103 revizuim \u0219i implementarea cur\u0103\u021b\u0103rii imaginilor.<\/p>\n<h3>Noua algoritm<\/h3>\n<p>\nDe ce? La etichetarea pe baza con\u021binutului, fiecare etichet\u0103 poate corespunde mai multor commit-uri \u00een Git. La cur\u0103\u021barea imaginilor, nu mai este posibil <i>doar<\/i> s\u0103 ne baz\u0103m pe commit-ul la care noua etichet\u0103 a fost ad\u0103ugat\u0103 \u00een registry.<\/p>\n<p>Pentru noua algoritm de cur\u0103\u021bare, s-a decis s\u0103 renun\u021b\u0103m la schemele de etichetare \u0219i s\u0103 construim <strong>procesul pe baza meta-imagenelor<\/strong>, fiecare dintre acestea stoc\u00e2nd o leg\u0103tur\u0103 din:<\/p>\n<ul>\n<li>commitul pe care s-a efectuat publicarea (indiferent dac\u0103 a fost ad\u0103ugat, modificat sau a r\u0103mas acela\u0219i \u00een registrul de containere);<\/li>\n<li>\u0219i identificatorul nostru intern, corespunz\u0103tor imaginii create.<\/li>\n<\/ul>\n<p>\nCu alte cuvinte, a fost asigurat\u0103 <strong>corelarea etichetelor publicate cu comit\u0103rile din Git<\/strong>.<\/p>\n<h3>Configurarea final\u0103 \u0219i algoritmul general<\/h3>\n<p>\nUtilizatorii, la configurarea cur\u0103\u021b\u0103rii, au avut acces la politicile prin care se selecteaz\u0103 imaginile actuale. Fiecare astfel de politic\u0103 este definit\u0103:<\/p>\n<ul>\n<li>de un set de referin\u021be, adic\u0103 etichete Git sau ramuri Git, care sunt utilizate \u00een timpul scan\u0103rii;<\/li>\n<li>\u0219i de limita de imagini c\u0103utate pentru fiecare referin\u021b\u0103 din mul\u021bime.<\/li>\n<\/ul>\n<p>\nPentru ilustrare \u2014 iat\u0103 cum arat\u0103 acum configurarea politicilor implicite:<\/p>\n<pre><code class=\"plaintext\">cleanup:\n  keepPolicies:\n  - references:\n      tag: \\\/.*\\\/\\\n      limit:\n        last: 10\n  - references:\n      branch: \\\/.*\\\/\\\n      limit:\n        last: 10\n        in: 168h\n        operator: And\n    imagesPerReference:\n      last: 2\n      in: 168h\n      operator: And\n  - references:  \n      branch: \\\/^(main|staging|production)$\\\/\\\n    imagesPerReference:\n      last: 10\n<\/code><\/pre>\n<p>\nAceast\u0103 configura\u021bie con\u021bine trei politici, care corespunz\u0103tor urm\u0103toarelor reguli:<\/p>\n<ol>\n<li>Men\u021binerea imaginii pentru ultimele 10 etichete Git (dup\u0103 data cre\u0103rii etichetei).<\/li>\n<li>Men\u021binerea a nu mai mult de 2 imagini, publicate \u00een ultima s\u0103pt\u0103m\u00e2n\u0103, pentru nu mai mult de 10 ramuri active \u00een ultima s\u0103pt\u0103m\u00e2n\u0103.<\/li>\n<li>Men\u021binerea a 10 imagini pentru ramuri <code>main<\/code>, <code>staging<\/code> \u0219i <code>produc\u021bie<\/code>.<\/li>\n<\/ol>\n<p>\nAlgoritmul final se rezum\u0103 la urm\u0103torii pa\u0219i:<\/p>\n<ul>\n<li>Ob\u021binerea manifestelor din registrul de containere.<\/li>\n<li>Excluderea imaginilor utilizate \u00een Kubernetes, deoarece acestea au fost deja selectate, interog\u00e2nd API-ul K8s.<\/li>\n<li>Scanarea istoricului Git \u0219i excluderea imaginilor conform politicilor specificate.<\/li>\n<li>\u0218tergerea imaginilor r\u0103mase.<\/li>\n<\/ul>\n<p>\nRevenind la ilustrarea noastr\u0103, iat\u0103 ce rezult\u0103 pentru werf:<\/p>\n<p><img decoding=\"async\" alt=\"Problema \u201einteligent\u0103\u201d a cur\u0103\u021b\u0103rii imaginilor containerelor \u0219i solu\u021bia acesteia \u00een werf\" src=\"\/wp-content\/uploads\/2020\/10\/c453092dca23860a0dda604843845507.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nCu toate acestea, chiar dac\u0103 nu folosi\u021bi werf, o abordare similar\u0103 pentru cur\u0103\u021barea avansat\u0103 a imaginilor \u2014 \u00eentr-o form\u0103 sau alta (conform metodei preferate de etichetare a imaginilor) \u2014 poate fi aplicat\u0103 \u0219i \u00een alte sisteme\/utilitare. Este suficient s\u0103 \u021bine\u021bi cont de problemele care apar \u0219i s\u0103 g\u0103si\u021bi acele oportunit\u0103\u021bi \u00een tehnologia dumneavoastr\u0103 care permit integrarea solu\u021biei lor c\u00e2t mai neted. Sper\u0103m c\u0103 drumul parcurs de noi va ajuta la analizarea situa\u021biei dumneavoastr\u0103 particulare cu noi detalii \u0219i g\u00e2nduri.<\/p>\n<h2>Concluzie<\/h2>\n<p><\/p>\n<ul>\n<li>Mai devreme sau mai t\u00e2rziu, problema umplerii registrului se confrunt\u0103 cu majoritatea echipelor. <\/li>\n<li>C\u00e2nd c\u0103uta\u021bi solu\u021bii, trebuie mai \u00eent\u00e2i s\u0103 defini\u021bi criteriile de relevan\u021b\u0103 ale imaginilor.<\/li>\n<li>Instrumentele oferite de serviciile populare de container registry permit organizarea unei cur\u0103\u021b\u0103ri foarte simple, care nu ia \u00een considerare \u201elumea extern\u0103\u201d: imagini utilizate \u00een Kubernetes \u0219i caracteristicile proceselor de lucru din echip\u0103.<\/li>\n<li>Un algoritm flexibil \u0219i eficient trebuie s\u0103 aib\u0103 o \u00een\u021belegere a proceselor CI\/CD, oper\u00e2nd nu doar cu datele imaginilor Docker.<\/li>\n<\/ul>\n<p><\/p>\n<h2>P.S.<\/h2>\n<p>\nCiti\u021bi \u0219i \u00een blogul nostru:<\/p>\n<ul>\n<li> \u00ab<noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/flant\/blog\/495112\/\">Tagging bazat pe con\u021binut \u00een compilatorul werf: de ce \u0219i cum func\u021bioneaz\u0103?<\/a><\/noindex>\u00bb;<\/li>\n<li> \u00ab<noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/flant\/blog\/476646\/\">Mergerea 3-way \u00een werf: implementare \u00een Kubernetes cu Helm \u201epe steroizi\u201d<\/a><\/noindex>\u00bb;<\/li>\n<li> \u00ab<noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/flant\/blog\/465131\/\">Suport pentru monorepo \u0219i multirepo \u00een werf \u0219i ce leg\u0103tur\u0103 are cu Docker Registry<\/a><\/noindex>\u00bb;<\/li>\n<li> \u00ab<noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/flant\/blog\/493170\/\">Lansarea werf 1.1: \u00eembun\u0103t\u0103\u021biri \u00een constructor ast\u0103zi \u0219i planuri de viitor<\/a><\/noindex>\u00bb.<\/li>\n<\/ul>\n<p>Sursa: <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/flant\/blog\/522024\/\">habr.com<\/a> <\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>\u0412 \u0441\u0442\u0430\u0442\u044c\u0435 \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0435\u043d\u0430 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430\u0442\u0438\u043a\u0430 \u043e\u0447\u0438\u0441\u0442\u043a\u0438 \u043e\u0431\u0440\u0430\u0437\u043e\u0432, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043d\u0430\u043a\u0430\u043f\u043b\u0438\u0432\u0430\u044e\u0442\u0441\u044f \u0432 \u0440\u0435\u0435\u0441\u0442\u0440\u0430\u0445 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u043e\u0432 (Docker Registry \u0438 \u0435\u0433\u043e \u0430\u043d\u0430\u043b\u043e\u0433\u0430\u0445) \u0432 \u0440\u0435\u0430\u043b\u0438\u044f\u0445 \u0441\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 CI\/CD-\u043f\u0430\u0439\u043f\u043b\u0430\u0439\u043d\u043e\u0432 \u0434\u043b\u044f cloud native-\u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439, \u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u043c\u044b\u0445 \u0432 Kubernetes. \u041f\u0440\u0438\u0432\u0435\u0434\u0435\u043d\u044b \u043e\u0441\u043d\u043e\u0432\u043d\u044b\u0435 \u043a\u0440\u0438\u0442\u0435\u0440\u0438\u0438 \u0430\u043a\u0442\u0443\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u043e\u0431\u0440\u0430\u0437\u043e\u0432 \u0438 \u0432\u044b\u0442\u0435\u043a\u0430\u044e\u0449\u0438\u0435 \u0438\u0437 \u043d\u0438\u0445 \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u043f\u0440\u0438 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0437\u0430\u0446\u0438\u0438 \u043e\u0447\u0438\u0441\u0442\u043a\u0438, \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u043c\u0435\u0441\u0442\u0430 \u0438 \u0443\u0434\u043e\u0432\u043b\u0435\u0442\u0432\u043e\u0440\u0435\u043d\u0438\u044f \u043f\u043e\u0442\u0440\u0435\u0431\u043d\u043e\u0441\u0442\u044f\u043c \u043a\u043e\u043c\u0430\u043d\u0434. \u041d\u0430\u043a\u043e\u043d\u0435\u0446, \u043d\u0430 \u043f\u0440\u0438\u043c\u0435\u0440\u0435 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e\u0433\u043e Open Source-\u043f\u0440\u043e\u0435\u043a\u0442\u0430 \u043c\u044b \u0440\u0430\u0441\u0441\u043a\u0430\u0436\u0435\u043c, \u043a\u0430\u043a \u044d\u0442\u0438 [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":96066,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[688],"tags":[],"class_list":["post-96065","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-administrirovanie"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 5.0.2.1 - aioseo.com -->\n\t<meta name=\"description\" content=\"\u0412 \u0441\u0442\u0430\u0442\u044c\u0435 \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0435\u043d\u0430.\" \/>\n\t<meta name=\"robots\" content=\"max-image-preview:large\" \/>\n\t<meta name=\"author\" content=\"Yuri Gagarin\"\/>\n\t<link rel=\"canonical\" href=\"https:\/\/prohoster.info\/ro\/blog\/administrirovanie\/problema-umnoj-ochistki-obrazov-kontejnerov-i-eyo-reshenie-v-werf\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.2.1\" \/>\n\t\t<meta property=\"og:locale\" content=\"ro_RO\" \/>\n\t\t<meta property=\"og:site_name\" content=\"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b\" \/>\n\t\t<meta property=\"og:type\" content=\"article\" \/>\n\t\t<meta property=\"og:title\" content=\"\ud83e\udd47\u041f\u0440\u043e\u0431\u043b\u0435\u043c\u0430 \u00ab\u0443\u043c\u043d\u043e\u0439\u00bb \u043e\u0447\u0438\u0441\u0442\u043a\u0438 \u043e\u0431\u0440\u0430\u0437\u043e\u0432 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u043e\u0432 \u0438 \u0435\u0451 \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u0432 werf | ProHoster\" \/>\n\t\t<meta property=\"og:description\" content=\"\u0412 \u0441\u0442\u0430\u0442\u044c\u0435 \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0435\u043d\u0430.\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/ro\/blog\/administrirovanie\/problema-umnoj-ochistki-obrazov-kontejnerov-i-eyo-reshenie-v-werf\" \/>\n\t\t<meta property=\"og:image\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:secure_url\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:width\" content=\"350\" \/>\n\t\t<meta property=\"og:image:height\" content=\"350\" \/>\n\t\t<meta property=\"article:published_time\" content=\"2020-10-07T11:42:09+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2020-10-07T11:42:09+00:00\" \/>\n\t\t<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<meta property=\"article:author\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<!-- All in One SEO -->\n\n","aioseo_head_json":{"title":"\ud83e\udd47Problema \u201einteligentei\u201d cur\u0103\u021biri a imaginilor containerelor \u0219i solu\u021bia acesteia \u00een werf | ProHoster","description":"Articolul abordeaz\u0103 acest subiect.","canonical_url":"https:\/\/prohoster.info\/ro\/blog\/administrirovanie\/problema-umnoj-ochistki-obrazov-kontejnerov-i-eyo-reshenie-v-werf","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"ro_RO","og:site_name":"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b","og:type":"article","og:title":"\ud83e\udd47\u041f\u0440\u043e\u0431\u043b\u0435\u043c\u0430 \u00ab\u0443\u043c\u043d\u043e\u0439\u00bb \u043e\u0447\u0438\u0441\u0442\u043a\u0438 \u043e\u0431\u0440\u0430\u0437\u043e\u0432 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u043e\u0432 \u0438 \u0435\u0451 \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u0432 werf | ProHoster","og:description":"\u0412 \u0441\u0442\u0430\u0442\u044c\u0435 \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0435\u043d\u0430.","og:url":"https:\/\/prohoster.info\/ro\/blog\/administrirovanie\/problema-umnoj-ochistki-obrazov-kontejnerov-i-eyo-reshenie-v-werf","og:image":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:secure_url":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:width":350,"og:image:height":350,"article:published_time":"2020-10-07T11:42:09+00:00","article:modified_time":"2020-10-07T11:42:09+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"96065","title":null,"description":null,"keywords":null,"keyphrases":null,"primary_term":null,"canonical_url":null,"og_title":null,"og_description":null,"og_object_type":"default","og_image_type":"default","og_image_url":null,"og_image_width":null,"og_image_height":null,"og_image_custom_url":null,"og_image_custom_fields":null,"og_video":null,"og_custom_url":null,"og_article_section":null,"og_article_tags":null,"twitter_use_og":false,"twitter_card":"default","twitter_image_type":"default","twitter_image_url":null,"twitter_image_custom_url":null,"twitter_image_custom_fields":null,"twitter_title":null,"twitter_description":null,"schema":{"blockGraphs":[],"customGraphs":[],"default":{"data":{"Article":[],"Course":[],"Dataset":[],"FAQPage":[],"Movie":[],"Person":[],"Product":[],"ProductReview":[],"Car":[],"Recipe":[],"Service":[],"SoftwareApplication":[],"WebPage":[]},"graphName":"","isEnabled":true},"graphs":[]},"schema_type":null,"schema_type_options":null,"pillar_content":false,"robots_default":true,"robots_noindex":false,"robots_noarchive":false,"robots_nosnippet":false,"robots_nofollow":false,"robots_noimageindex":false,"robots_noodp":false,"robots_notranslate":false,"robots_max_snippet":null,"robots_max_videopreview":null,"robots_max_imagepreview":"large","priority":null,"frequency":null,"local_seo":null,"seo_analyzer_scan_date":null,"breadcrumb_settings":null,"limit_modified_date":false,"reviewed_by":null,"ai":null,"created":"2021-02-28 10:52:24","updated":"2022-10-01 08:58:07","focus_keyword":null,"additional_keywords":null,"truseo_locale":null},"gt_translate_keys":[{"key":"link","format":"url"}],"_links":{"self":[{"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/posts\/96065","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/comments?post=96065"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/posts\/96065\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/media\/96066"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/media?parent=96065"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/categories?post=96065"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/tags?post=96065"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}