{"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\/sv\/blog\/administrirovanie\/problema-umnoj-ochistki-obrazov-kontejnerov-i-eyo-reshenie-v-werf","title":{"rendered":"Problemet med \"smart\" rensning av containeravbilder och dess l\u00f6sning i werf","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"Problemet med &quot;smart&quot; rensning av containeravbilder och dess l\u00f6sning i werf\" src=\"\/wp-content\/uploads\/2020\/10\/1410cea46bb8dcdc3ac06db11ed5a402.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nI artikeln diskuteras problematiken kring rensning av avbilder som samlas i containerregistren (Docker Registry och dess motsvarigheter) i dagens CI\/CD-pipelines f\u00f6r cloud native-applikationer som distribueras i Kubernetes. Huvudkriterier f\u00f6r avbilders aktualitet beskrivs, liksom de sv\u00e5righeter som uppst\u00e5r vid automatisering av rensning, utnyttjande av utrymme och tillfredsst\u00e4llande av teamens behov. Slutligen, genom ett specifikt Open Source-projekt, f\u00f6rklarar vi hur dessa utmaningar kan \u00f6vervinnas.<\/p>\n<h2>Introduktion<\/h2>\n<p>\nAntalet avbilder i containerregistret kan snabbt v\u00e4xa och ta upp mer utrymme i lagringen, vilket i sin tur kan \u00f6ka kostnaden avsev\u00e4rt. F\u00f6r att kontrollera, begr\u00e4nsa eller uppr\u00e4tth\u00e5lla en acceptabel tillv\u00e4xt av det utrymme som upptas i registret, g\u00f6rs f\u00f6ljande:<\/p>\n<ol>\n<li>anv\u00e4nda ett fast antal taggar f\u00f6r avbilder;<\/li>\n<li>p\u00e5 n\u00e5got s\u00e4tt rensa avbilder.<\/li>\n<\/ol>\n<p><noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><br \/>\nDen f\u00f6rsta begr\u00e4nsningen \u00e4r ibland acceptabel f\u00f6r sm\u00e5 team. Om utvecklarna klarar sig med fasta taggar (<code>latest<\/code>, <code>main<\/code>, <code>test<\/code>, <code>boris<\/code> och s\u00e5 vidare), kommer registret inte att sv\u00e4lla i storlek och under l\u00e5ng tid beh\u00f6ver man inte ens t\u00e4nka p\u00e5 rensning. Alla obeh\u00f6vliga avbilder \u00e5sidos\u00e4tts och det finns helt enkelt inget arbete kvar att g\u00f6ra f\u00f6r rensning (allt hanteras av den vanliga skr\u00e4pbilen).<\/p>\n<p>Trots detta begr\u00e4nsar en s\u00e5dan strategi utvecklingen kraftigt och \u00e4r s\u00e4llan till\u00e4mpbar inom CI\/CD i moderna projekt. Automatisering har blivit en integrerad del av utvecklingsprocessen, <strong>som m\u00f6jligg\u00f6r snabbare testning, distribution och leverans av ny funktionalitet till anv\u00e4ndarna. Till exempel skapas det i alla v\u00e5ra projekt automatiskt en CI-pipeline vid varje commit. I den byggs en avbild, testas, distribueras till olika Kubernetes-milj\u00f6er f\u00f6r fels\u00f6kning och vidare kontroller, och om allt g\u00e5r bra - n\u00e5r f\u00f6r\u00e4ndringarna slutligen anv\u00e4ndaren. Detta \u00e4r inte l\u00e4ngre raketvetenskap, utan en vanlig f\u00f6reteelse f\u00f6r m\u00e5nga - f\u00f6rmodligen \u00e4ven f\u00f6r dig, eftersom du l\u00e4ser denna artikel.<\/strong>Eftersom buggar fixas och ny funktionalitet utvecklas parallellt, och med flera releaser som kan ske varje dag, \u00e4r det uppenbart att utvecklingsprocessen \u00e5tf\u00f6ljs av ett betydande antal commits, vilket inneb\u00e4r -<\/p>\n<p>ett stort antal avbilder i registret. <strong>ett stort antal av bilder i registret<\/strong>. Som ett resultat uppst\u00e5r en akut fr\u00e5ga om hur man organiserar en effektiv reng\u00f6ring av registret, dvs. att ta bort inaktuella avbilder.<\/p>\n<p>Men hur kan man \u00f6verhuvudtaget avg\u00f6ra om en avbild \u00e4r aktuell?<\/p>\n<h2>Kriterier f\u00f6r aktuell avbild<\/h2>\n<p>\nI \u00f6verv\u00e4ldigande fall kommer de viktigaste kriterierna att vara f\u00f6ljande:<\/p>\n<p>1. Det f\u00f6rsta (det mest uppenbara och mest kritiska av alla) \u00e4r avbilder som <strong>just nu anv\u00e4nds i Kubernetes<\/strong>. Att ta bort dessa avbilder kan leda till betydande kostnader relaterade till stillest\u00e5nd i produktionen (till exempel kan avbilder beh\u00f6vas vid replikering) eller helt enkelt f\u00f6rst\u00f6ra teamets insatser som arbetar med fels\u00f6kning p\u00e5 n\u00e5got av konturerna. <i>(Av denna anledning har vi \u00e4ven skapat en speciell <\/i><noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/flant\/k8s-image-availability-exporter\"><i>Prometheus exporter<\/i><\/a><\/noindex><i>, som \u00f6vervakar avsaknaden av s\u00e5dana avbilder i alla Kubernetes-kluster.)<\/i><\/p>\n<p>2. Det andra (mindre uppenbart, men ocks\u00e5 mycket viktigt och \u00e5terigen relaterat till drift) \u00e4r avbilder som <strong>kr\u00e4vs f\u00f6r att \u00e5terg\u00e5 i h\u00e4ndelse av allvarliga problem<\/strong> i den aktuella versionen. Till exempel, i fallet med Helm handlar det om avbilder som anv\u00e4nds i sparade versioner av en release. (F\u00f6r \u00f6vrigt, som standard g\u00e4ller en gr\u00e4ns p\u00e5 256 revisioner i Helm, men f\u00e5 m\u00e4nniskor har nog faktiskt behov av att spara <i>s\u00e5 mycket<\/i> versioner?..) Faktum \u00e4r att vi, bland annat, sparar versioner s\u00e5 att vi sedan kan anv\u00e4nda dem, dvs. \"\u00e5terg\u00e5\" till dem vid behov.<\/p>\n<p>3. Det tredje \u2014 <strong>utvecklarbehoven<\/strong>: alla avbilder som \u00e4r kopplade till deras nuvarande arbeten. Till exempel, om vi granskar ett PR kan det vara meningsfullt att beh\u00e5lla avbilden som motsvarar den senaste commit och, s\u00e4g, den f\u00f6reg\u00e5ende commit: p\u00e5 s\u00e5 s\u00e4tt kan utvecklaren snabbt \u00e5terv\u00e4nda till vilken uppgift som helst och arbeta med de senaste \u00e4ndringarna. <\/p>\n<p>4. Det fj\u00e4rde \u2014 avbilder som <strong>motsvarar versionerna av v\u00e5r applikation<\/strong>, dvs. som \u00e4r den slutliga produkten: v1.0.0, 20.04.01, sierra osv.<\/p>\n<p>NB: Kriterierna som anges h\u00e4r har formulerats utifr\u00e5n erfarenheter av samarbete med tiotals utvecklarteam fr\u00e5n olika f\u00f6retag. Men naturligtvis, beroende p\u00e5 egenskaperna i utvecklingsprocesserna och den anv\u00e4nda infrastrukturen (t.ex. om Kubernetes inte anv\u00e4nds), kan dessa kriterier variera. <\/p>\n<h2>\u00d6verensst\u00e4mmelse med kriterier och befintliga l\u00f6sningar<\/h2>\n<p>\nPopul\u00e4ra tj\u00e4nster med container registry erbjuder vanligtvis sina egna policyer f\u00f6r rensning av bilder: i dem kan du definiera villkor under vilka en tagg tas bort fr\u00e5n registry. Men m\u00f6jligheterna med dessa villkor begr\u00e4nsas av parametrar som namn, skapelsedatum och antal taggar*.<\/p>\n<p><i>* Beroende p\u00e5 specifika implementationer av container registry. Vi har \u00f6verv\u00e4gt m\u00f6jligheterna hos f\u00f6ljande l\u00f6sningar: Azure CR, Docker Hub, ECR, GCR, GitHub Packages, GitLab Container Registry, Harbor Registry, JFrog Artifactory, Quay.io \u2014 per september 2020.<\/i><\/p>\n<p>Dessa parametrar \u00e4r helt tillr\u00e4ckliga f\u00f6r att uppfylla det fj\u00e4rde kriteriet - att v\u00e4lja bilder som motsvarar versioner. Men f\u00f6r alla andra kriterier m\u00e5ste man v\u00e4lja n\u00e5gon form av kompromissl\u00f6sning (en mer strikt eller \u00e5 sin sida mer tolerant politik) - beroende p\u00e5 f\u00f6rv\u00e4ntningar och ekonomiska m\u00f6jligheter.<\/p>\n<p>Till exempel kan det tredje kriteriet - som r\u00f6r utvecklarnas behov - l\u00f6sas genom att organisera processer inom team: specifik namngivning av bilder, uppr\u00e4tta speciella allow lists och interna avtal. Men i slut\u00e4ndan m\u00e5ste det \u00e4nd\u00e5 automatiseras. Och om de f\u00e4rdiga l\u00f6sningarna inte r\u00e4cker till, m\u00e5ste man g\u00f6ra n\u00e5got eget.<\/p>\n<p>Situationen med de tv\u00e5 f\u00f6rsta kriterierna \u00e4r liknande: de kan inte uppfyllas utan att f\u00e5 data fr\u00e5n ett externt system - det system d\u00e4r applikationerna distribueras (i v\u00e5rt fall \u00e4r det Kubernetes).<\/p>\n<h3>Illustration av arbetsfl\u00f6det i Git<\/h3>\n<p>\nAnta att du arbetar efter ett m\u00f6nster i Git:<\/p>\n<p><img decoding=\"async\" alt=\"Problemet med &quot;smart&quot; rensning av containeravbilder och dess l\u00f6sning i werf\" src=\"\/wp-content\/uploads\/2020\/10\/45c9bfb6755da1b4d6be05b51ab17429.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n<i>Ikonen med huvudet p\u00e5 diagrammet markerar de containerbilder som f\u00f6r n\u00e4rvarande \u00e4r distribuerade i Kubernetes f\u00f6r vissa anv\u00e4ndare (slutanv\u00e4ndare, testare, chefer etc.) eller anv\u00e4nds av utvecklare f\u00f6r debugging och liknande \u00e4ndam\u00e5l.<\/i><\/p>\n<p>Vad h\u00e4nder om rensningspolicyerna till\u00e5ter att bilder kvarst\u00e5r (inte tas bort) enbart <b>enligt angivna taggnamn<\/b>?<\/p>\n<p><img decoding=\"async\" alt=\"Problemet med &quot;smart&quot; rensning av containeravbilder och dess l\u00f6sning i werf\" src=\"\/wp-content\/uploads\/2020\/10\/e57ff24cb818799d28e8eb006aea2eb5.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nUppenbarligen blir ett s\u00e5dant scenario ingen glad.<\/p>\n<p>Vad \u00e4ndras om policyerna till\u00e5ter att inte ta bort bilder <b>enligt ett angivet tidsintervall \/ antal senaste commits<\/b>?<\/p>\n<p><img decoding=\"async\" alt=\"Problemet med &quot;smart&quot; rensning av containeravbilder och dess l\u00f6sning i werf\" src=\"\/wp-content\/uploads\/2020\/10\/7743581e6e64affb0a207ee156c00f6e.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nResultatet blev avsev\u00e4rt b\u00e4ttre, men \u00e4r fortfarande l\u00e5ngt ifr\u00e5n idealet. F\u00f6r vi har fortfarande utvecklare som beh\u00f6ver bilder i registret (eller till och med distribuerade i K8s) f\u00f6r att debugga buggar...<\/p>\n<p>Sammanfattningsvis, den nuvarande situationen p\u00e5 marknaden: de tillg\u00e4ngliga funktionerna i containerrregister erbjuder inte tillr\u00e4cklig flexibilitet f\u00f6r rensning, och den fr\u00e4msta orsaken \u00e4r att <strong>det inte finns n\u00e5got s\u00e4tt att interagera med omv\u00e4rlden<\/strong>. Det inneb\u00e4r att team som beh\u00f6ver denna flexibilitet tvingas implementera borttagning av bilder \"utifr\u00e5n\" genom att anv\u00e4nda Docker Registry API (eller det inhemska API:et f\u00f6r den aktuella implementeringen).<\/p>\n<p>Vi har dock s\u00f6kt efter en universell l\u00f6sning som automatiserar rensningen av bilder f\u00f6r olika team som anv\u00e4nder olika register\u2026<\/p>\n<h2>V\u00e5r v\u00e4g till universell rensning av bilder<\/h2>\n<p>\nVarf\u00f6r finns det ett s\u00e5dant behov? Det \u00e4r s\u00e5 att vi inte \u00e4r en separat grupp utvecklare, utan ett team som st\u00f6djer m\u00e5nga s\u00e5dana grupper, och hj\u00e4lper till att l\u00f6sa CI\/CD-fr\u00e5gor p\u00e5 ett omfattande s\u00e4tt. Och det viktigaste tekniska verktyget f\u00f6r detta \u00e4r en Open Source-verktyg <noindex><a rel=\"nofollow\" href=\"https:\/\/ru.werf.io\/\">werf<\/a><\/noindex>. Dess s\u00e4rskildhet ligger i att den inte utf\u00f6r en enda funktion, utan f\u00f6ljer processerna f\u00f6r kontinuerlig leverans i alla steg: fr\u00e5n byggande till deployment.<\/p>\n<p>Publiceringen av bilder i registret* (omedelbart efter deras byggande) \u00e4r en uppenbar funktion f\u00f6r ett s\u00e5dant verktyg. Eftersom bilderna lagras d\u00e4r beh\u00f6ver man, om ditt lagringsutrymme inte \u00e4r o\u00e4ndligt, ocks\u00e5 ta ansvar f\u00f6r deras efterf\u00f6ljande rensning. Hur vi lyckades med detta, och tillfredsst\u00e4llde alla angivna kriterier, kommer att diskuteras vidare.<\/p>\n<p><i>* \u00c4ven om sj\u00e4lva registren kan vara olika (Docker Registry, GitLab Container Registry, Harbor osv.), s\u00e5 m\u00f6ter deras anv\u00e4ndare samma problem. Den universella l\u00f6sningen i v\u00e5rt fall \u00e4r oberoende av registerens implementation, eftersom den utf\u00f6rs utanf\u00f6r sj\u00e4lva registren och erbjuder samma beteende f\u00f6r alla.<\/i><\/p>\n<p>Trots att vi anv\u00e4nder werf som exempel p\u00e5 implementation, hoppas vi att de anv\u00e4nda tillv\u00e4gag\u00e5ngss\u00e4tten kommer att vara anv\u00e4ndbara f\u00f6r andra team som st\u00e5r inf\u00f6r liknande sv\u00e5righeter.<\/p>\n<p>S\u00e5 vi b\u00f6rjade med <i>extern<\/i> implementeringen av en mekanism f\u00f6r att rensa bilder \u2014 ist\u00e4llet f\u00f6r de funktioner som redan \u00e4r inbyggda i registren f\u00f6r containrar. Det f\u00f6rsta steget var att anv\u00e4nda Docker Registry API f\u00f6r att skapa just dessa primitiva policyer baserade p\u00e5 antalet taggar och deras skapelsedatum (n\u00e4mnda ovan). Dessa kompletterades med en <strong>allow list baserad p\u00e5 bilder som anv\u00e4nds i den distribuerade infrastrukturen<\/strong>, dvs. Kubernetes. F\u00f6r det sistn\u00e4mnda r\u00e4ckte det att anv\u00e4nda Kubernetes API f\u00f6r att iterera \u00f6ver alla distribuerade resurser och f\u00e5 en lista med v\u00e4rden. <code>bild<\/code>.<\/p>\n<p>Denna triviala l\u00f6sning l\u00f6ste det mest kritiska problemet (kriterium nr 1), men var bara b\u00f6rjan p\u00e5 v\u00e5r v\u00e4g mot att f\u00f6rb\u00e4ttra st\u00e4dprocessen. N\u00e4sta \u2014 och mycket mer intressanta \u2014 steg var att l\u00f6sa <strong>knyta de publicerade bilderna till Git-historiken.<\/strong>.<\/p>\n<h3>Taggningsscheman<\/h3>\n<p>\nF\u00f6r att b\u00f6rja valde vi ett tillv\u00e4gag\u00e5ngss\u00e4tt d\u00e4r den slutliga bilden skulle lagra den n\u00f6dv\u00e4ndiga informationen f\u00f6r st\u00e4dning, och vi byggde processen p\u00e5 taggningsscheman. N\u00e4r anv\u00e4ndaren publicerade en bild valde hen ett visst alternativ f\u00f6r taggning (<code>git-gren<\/code>, <code>git-commit<\/code> eller <code>git-tag<\/code>) och anv\u00e4nde motsvarande v\u00e4rde. I CI-system sattes dessa v\u00e4rden automatiskt baserat p\u00e5 milj\u00f6variabler. I grund och botten <strong>s\u00e5 kn\u00f6ts den slutliga bilden till en viss Git-primitiv,<\/strong>, som lagrade n\u00f6dv\u00e4ndig data f\u00f6r st\u00e4dning i etiketter.<\/p>\n<p>Inom detta tillv\u00e4gag\u00e5ngss\u00e4tt uppstod en upps\u00e4ttning policyer som gjorde det m\u00f6jligt att anv\u00e4nda Git som den enda sanningsk\u00e4llan:<\/p>\n<ul>\n<li>Vid borttagning av en gren\/tagg i Git togs \u00e4ven de relaterade bilderna automatiskt bort fr\u00e5n registret.<\/li>\n<li>Antalet bilder kopplade till Git-taggar och commits kunde regleras med antalet taggar som anv\u00e4ndes i den valda schemat, samt tidpunkten f\u00f6r den relaterade committen.<\/li>\n<\/ul>\n<p>\n\u00d6verlag uppfyllde den resulterande implementationen v\u00e5ra behov, men snart v\u00e4ntade en ny utmaning. Problemet var att under tiden vi anv\u00e4nde taggningsscheman baserade p\u00e5 Git-primitiver st\u00f6tte vi p\u00e5 ett antal nackdelar. <i>(Eftersom deras beskrivning g\u00e5r utanf\u00f6r \u00e4mnet f\u00f6r denna artikel, kan alla intresserade f\u00e5 detaljerna <\/i><noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/flant\/blog\/495112\/\"><i>h\u00e4r<\/i><\/a><\/noindex><i>.)<\/i> D\u00e4rf\u00f6r, efter att ha beslutat att g\u00e5 \u00f6ver till ett mer effektivt tillv\u00e4gag\u00e5ngss\u00e4tt f\u00f6r taggning (inneh\u00e5llsbaserad taggning), var vi tvungna att ompr\u00f6va \u00e4ven v\u00e5r st\u00e4dimplementation.<\/p>\n<h3>Den nya algoritmen<\/h3>\n<p>\nVarf\u00f6r? Vid taggning inom ramen f\u00f6r inneh\u00e5llsbaserad kan varje tagg motsvara flera commits i Git. Vid st\u00e4dning av bilder kan man inte l\u00e4ngre utg\u00e5 <i>bara<\/i> fr\u00e5n committen d\u00e4r den nya taggen lades till i registret.<\/p>\n<p>F\u00f6r den nya st\u00e4dalgoritmen beslutades det att l\u00e4mna taggningsscheman och bygga <strong>processen p\u00e5 meta-bilder,<\/strong>, d\u00e4r varje bild lagrar en koppling av:<\/p>\n<ul>\n<li>commit som publiceringen utf\u00f6rdes (det spelar ingen roll om bilden lades till, \u00e4ndrades eller f\u00f6rblev densamma i containerregistret);<\/li>\n<li>och v\u00e5r interna identifierare som motsvarar den byggda bilden.<\/li>\n<\/ul>\n<p>\nMed andra ord, s\u00e4kerst\u00e4lldes <strong>kopplingen mellan de publicerade etiketterna och commits i Git.<\/strong>.<\/p>\n<h3>Den slutgiltiga konfigurationen och den \u00f6vergripande algoritmen<\/h3>\n<p>\nAnv\u00e4ndare i konfigurationen av st\u00e4dningen har nu tillg\u00e5ng till policys som avg\u00f6r hur aktuella bilder v\u00e4ljs. Varje s\u00e5dan policy definieras av:<\/p>\n<ul>\n<li>ett antal referenser, dvs. Git-taggar eller Git-grenar, som anv\u00e4nds vid skanning;<\/li>\n<li>och en gr\u00e4ns f\u00f6r antalet bilder som ska s\u00f6kas f\u00f6r varje referens fr\u00e5n m\u00e4ngden.<\/li>\n<\/ul>\n<p>\nSom en illustration \u2014 s\u00e5 h\u00e4r har konfigurationen av standardpolicys sett ut:<\/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>\nDenna konfiguration inneh\u00e5ller tre policys som motsvarar f\u00f6ljande regler:<\/p>\n<ol>\n<li>Beh\u00e5ll bilden f\u00f6r de 10 senaste Git-taggarna (baserat p\u00e5 datum f\u00f6r taggning).<\/li>\n<li>Beh\u00e5ll h\u00f6gst 2 bilder publicerade under den senaste veckan f\u00f6r h\u00f6gst 10 grenar som haft aktivitet den senaste veckan.<\/li>\n<li>Beh\u00e5ll 10 bilder f\u00f6r grenarna <code>main<\/code>, <code>staging<\/code> och <code>production<\/code>.<\/li>\n<\/ol>\n<p>\nDen slutgiltiga algoritmen sammanfattas i f\u00f6ljande steg:<\/p>\n<ul>\n<li>Inh\u00e4mta manifest fr\u00e5n container-registret.<\/li>\n<li>Exkludera bilder som anv\u00e4nds i Kubernetes, eftersom vi redan har filtrerat ut dem genom att fr\u00e5ga K8s API.<\/li>\n<li>Skanna Git-historiken och exkludera bilder enligt de angivna policys.<\/li>\n<li>Ta bort de \u00e5terst\u00e5ende bilderna.<\/li>\n<\/ul>\n<p>\n\u00c5terg\u00e5r vi till v\u00e5r illustration, s\u00e5 h\u00e4r ser det ut med werf:<\/p>\n<p><img decoding=\"async\" alt=\"Problemet med &quot;smart&quot; rensning av containeravbilder och dess l\u00f6sning i werf\" src=\"\/wp-content\/uploads\/2020\/10\/c453092dca23860a0dda604843845507.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nMen \u00e4ven om du inte anv\u00e4nder werf, kan en liknande metod f\u00f6r avancerad st\u00e4dning av bilder \u2014 i en eller annan implementation (enligt den f\u00f6redragna metoden f\u00f6r attetagningar av bilder) \u2014 till\u00e4mpas i andra system\/verktyg. Det \u00e4r nog att komma ih\u00e5g de problem som uppst\u00e5r och hitta de m\u00f6jligheter i din stack som l\u00e5ter dig integrera deras l\u00f6sning s\u00e5 smidigt som m\u00f6jligt. Vi hoppas att den v\u00e4g vi har g\u00e5tt kan hj\u00e4lpa dig att se p\u00e5 ditt specifika fall med nya detaljer och tankar.<\/p>\n<h2>Slutsats<\/h2>\n<p><\/p>\n<ul>\n<li>S\u00e5 sm\u00e5ningom m\u00f6ter n\u00e4stan alla team problemet med att register blir \u00f6verfulla. <\/li>\n<li>Vid s\u00f6kandet efter l\u00f6sningar \u00e4r det f\u00f6rst och fr\u00e4mst n\u00f6dv\u00e4ndigt att fastst\u00e4lla kriterierna f\u00f6r relevansen av bilden.<\/li>\n<li>Verktygen som erbjuds av popul\u00e4ra container registry-tj\u00e4nster g\u00f6r det m\u00f6jligt att organisera en mycket enkel reng\u00f6ring, som inte tar h\u00e4nsyn till \"den yttre v\u00e4rlden\": bilder som anv\u00e4nds i Kubernetes och s\u00e4rskildheterna i arbetsfl\u00f6den inom teamet.<\/li>\n<li>En flexibel och effektiv algoritm m\u00e5ste ha en uppfattning om CI\/CD-processer och hantera inte bara data fr\u00e5n Docker-bilder.<\/li>\n<\/ul>\n<p><\/p>\n<h2>P.S.<\/h2>\n<p>\nL\u00e4s \u00e4ven i v\u00e5r blogg:<\/p>\n<ul>\n<li> \u00ab<noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/flant\/blog\/495112\/\">Content-based tagging i byggverktyget werf: varf\u00f6r och hur fungerar det?<\/a><\/noindex>\u00bb;<\/li>\n<li> \u00ab<noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/flant\/blog\/476646\/\">3-v\u00e4gs sammanslagning i werf: distribution i Kubernetes med Helm \"p\u00e5 steroider\"<\/a><\/noindex>\u00bb;<\/li>\n<li> \u00ab<noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/flant\/blog\/465131\/\">St\u00f6d f\u00f6r monorepo och multirepo i werf och vad Docker Registry har med det att g\u00f6ra<\/a><\/noindex>\u00bb;<\/li>\n<li> \u00ab<noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/flant\/blog\/493170\/\">Utg\u00e5van av werf 1.1: f\u00f6rb\u00e4ttringar i byggverktyget idag och planer f\u00f6r framtiden<\/a><\/noindex>\u00bb.<\/li>\n<\/ul>\n<p>K\u00e4lla: <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.4 - 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\/sv\/blog\/administrirovanie\/problema-umnoj-ochistki-obrazov-kontejnerov-i-eyo-reshenie-v-werf\" \/>\n\t\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.4\" \/>\n\t\t<meta property=\"og:locale\" content=\"sv_SE\" \/>\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\/sv\/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\udd47Problemet med \"smart\" reng\u00f6ring av containerbilder och dess l\u00f6sning i werf | ProHoster","description":"Artikeln diskuteras.","canonical_url":"https:\/\/prohoster.info\/sv\/blog\/administrirovanie\/problema-umnoj-ochistki-obrazov-kontejnerov-i-eyo-reshenie-v-werf","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"sv_SE","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\/sv\/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\/sv\/wp-json\/wp\/v2\/posts\/96065","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/comments?post=96065"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/posts\/96065\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/media\/96066"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/media?parent=96065"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/categories?post=96065"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/tags?post=96065"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}