{"id":37667,"date":"2019-10-31T22:18:58","date_gmt":"2019-10-31T19:18:58","guid":{"rendered":"https:\/\/prohoster.info\/blog\/podderzhka-monorepo-i-multirepo-v-werf-i-pri-chyom-zdes-docker-registry\/"},"modified":"2019-10-31T22:18:58","modified_gmt":"2019-10-31T19:18:58","slug":"podderzhka-monorepo-i-multirepo-v-werf-i-pri-chyom-zdes-docker-registry","status":"publish","type":"post","link":"https:\/\/prohoster.info\/pl\/blog\/administrirovanie\/podderzhka-monorepo-i-multirepo-v-werf-i-pri-chyom-zdes-docker-registry","title":{"rendered":"Wsparcie dla monorepo i multirepo w werf i jakie ma to znaczenie dla Docker Registry","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"Wsparcie dla monorepo i multirepo w werf i jakie ma to znaczenie dla Docker Registry\" src=\"\/wp-content\/uploads\/2019\/09\/7bd2036d8e53b04965212698a209d4c7.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nTemat monorepo by\u0142 ju\u017c wielokrotnie omawiany i zazwyczaj wywo\u0142uje do\u015b\u0107 \u017cywe dyskusje. Tworz\u0105c <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/flant\/werf\">werf<\/a><\/noindex> jako narz\u0119dzie Open Source, maj\u0105ce na celu ulepszenie proces\u00f3w budowy kodu aplikacji z Git do obraz\u00f3w Docker (i ich p\u00f3\u017aniejszej dostawy do Kubernetes), rzadko zastanawiamy si\u0119, kt\u00f3ry wyb\u00f3r jest lepszy. Najwa\u017cniejsze dla nas jest zapewnienie wszystkiego, co niezb\u0119dne zwolennikom r\u00f3\u017cnych opinii (o ile to nie stoi w sprzeczno\u015bci z rozs\u0105dkiem, oczywi\u015bcie).<\/p>\n<p>Niedawno wprowadzona obs\u0142uga mono-repo w werf jest dobrym tego przyk\u0142adem. Ale najpierw rozwa\u017cmy, jak ta obs\u0142uga w og\u00f3le wi\u0105\u017ce si\u0119 z u\u017cywaniem werf i co ma wsp\u00f3lnego z Docker Registry\u2026<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<h2>Problematyka<\/h2>\n<p>\nWyobra\u017amy sobie tak\u0105 sytuacj\u0119. W firmie jest wiele zespo\u0142\u00f3w programistycznych zajmuj\u0105cych si\u0119 niezale\u017cnymi projektami. Wi\u0119kszo\u015b\u0107 aplikacji dzia\u0142a w Kubernetes, a zatem s\u0105 konteneryzowane. Do przechowywania kontener\u00f3w i obraz\u00f3w potrzebny jest rejestr (registry). Jako taki rejestr w firmie u\u017cywany jest Docker Hub z jedynym kontem <code>COMPANY<\/code>. Na podobie\u0144stwo wi\u0119kszo\u015bci system\u00f3w przechowywania kodu \u017ar\u00f3d\u0142owego, <b>Docker Hub nie pozwala na tworzenie zagnie\u017cd\u017conej hierarchii repozytori\u00f3w<\/b>, takiej jak <code>COMPANY\/PROJECT\/IMAGE<\/code>. W takim przypadku\u2026 jak wi\u0119c przechowywa\u0107 w rejestrze aplilacje niemonolityczne, nie tworz\u0105c osobnego konta dla ka\u017cdego projektu? <\/p>\n<p><img decoding=\"async\" alt=\"Wsparcie dla monorepo i multirepo w werf i jakie ma to znaczenie dla Docker Registry\" src=\"\/wp-content\/uploads\/2019\/09\/b7905fab48723a123bee536e1fe56c5a.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nMo\u017cliwe, \u017ce opisana sytuacja jest komu\u015b znana, ale rozwa\u017cmy temat organizacji przechowywania aplikacji w og\u00f3le, tzn. bez odniesienia do powy\u017cszego przyk\u0142adu i Docker Hub.<\/p>\n<h3>Sposoby rozwi\u0105zania<\/h3>\n<p>\nJe\u015bli aplikacja <b>jest monolityczna<\/b>, dostarczana w jednym obrazie, to nie ma z tym problem\u00f3w i po prostu zapisujemy obrazy w rejestrze kontener\u00f3w projektu.<\/p>\n<p>Gdy aplikacja jest przedstawiona w postaci kilku komponent\u00f3w, <b>mikroserwis\u00f3w<\/b>, nale\u017cy wybra\u0107 okre\u015blone podej\u015bcie. Na przyk\u0142adzie typowej aplikacji webowej sk\u0142adaj\u0105cej si\u0119 z dw\u00f3ch obraz\u00f3w: <code>frontend<\/code> i <code>backend<\/code> \u2014 mo\u017cliwe opcje to:<\/p>\n<ol>\n<li> Przechowywa\u0107 obrazy w osobnych zagnie\u017cd\u017conych repozytoriach:\n<p><img decoding=\"async\" alt=\"Wsparcie dla monorepo i multirepo w werf i jakie ma to znaczenie dla Docker Registry\" src=\"\/wp-content\/uploads\/2019\/09\/a05bfdaec10ea7b4542200c6a2bb4939.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/li>\n<li> Przechowywa\u0107 wszystko w jednym repozytorium, a nazw\u0119 obrazu uwzgl\u0119dni\u0107 w tagu, na przyk\u0142ad w nast\u0119puj\u0105cy spos\u00f3b:\n<p><img decoding=\"async\" alt=\"Wsparcie dla monorepo i multirepo w werf i jakie ma to znaczenie dla Docker Registry\" src=\"\/wp-content\/uploads\/2019\/09\/83498b5bcdf7a57dfe933295e78fc785.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/li>\n<\/ol>\n<p>\n<i><b>NB<\/b>: W og\u00f3le rzecz bior\u0105c, istnieje jeszcze mo\u017cliwo\u015b\u0107 przechowywania w r\u00f3\u017cnych repozytoriach, <code>PROJECT-frontend<\/code> i <code>PROJECT-backend<\/code>, ale nie b\u0119dziemy jej rozwa\u017ca\u0107 ze wzgl\u0119du na trudno\u015bci w utrzymaniu, organizacji i rozdzielaniu uprawnie\u0144 mi\u0119dzy u\u017cytkownikami.<\/i><\/p>\n<h2>Wsparcie w werf<\/h2>\n<p>\nPocz\u0105tkowo werf ogranicza\u0142 si\u0119 do zagnie\u017cd\u017conych repozytori\u00f3w \u2014 na szcz\u0119\u015bcie wi\u0119kszo\u015b\u0107 rejestr\u00f3w wspiera t\u0119 mo\u017cliwo\u015b\u0107. Od wersji <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/flant\/werf\/releases\/tag\/v1.0.4-alpha.3\">v1.0.4-alpha.3<\/a><\/noindex>, dodano obs\u0142ug\u0119 rejestr\u00f3w, w kt\u00f3rych <b>nie wspiera si\u0119 zagnie\u017cd\u017cenia<\/b>, a Docker Hub jest jednym z nich. Od tego momentu u\u017cytkownik ma wyb\u00f3r, jak przechowywa\u0107 obrazy aplikacji.<\/p>\n<p>Implementacja jest dost\u0119pna w ramach opcji <code>--images-repo-mode=multirepo|monorepo<\/code> (domy\u015blnie <code>multirepo<\/code>, tj. przechowywanie w zagnie\u017cd\u017conych repozytoriach). Okre\u015bla ona wzorce, wed\u0142ug kt\u00f3rych obrazy s\u0105 przechowywane w rejestrze. Wystarczy wybra\u0107 odpowiedni tryb przy u\u017cyciu podstawowych polece\u0144, a reszta pozostanie niezmieniona.<\/p>\n<p>Poniewa\u017c wi\u0119kszo\u015b\u0107 opcji werf mo\u017cna ustawia\u0107 <b>zmiennymi \u015brodowiskowymi<\/b>, w systemach CI\/CD tryb przechowywania, zazwyczaj, mo\u017cna \u0142atwo ustawi\u0107 globalnie dla ca\u0142ego projektu. Na przyk\u0142ad, <b>w przypadku GitLaba<\/b> wystarczy doda\u0107 zmienn\u0105 \u015brodowiskow\u0105 w ustawieniach projektu: <i>Ustawienia -&gt; CI \/ CD -&gt; Zmienne: <code>WERF_IMAGES_REPO_MODE: multirepo|monorepo<\/code><\/i>.<\/p>\n<p>Je\u015bli m\u00f3wimy o publikacji obraz\u00f3w i wdra\u017caniu aplikacji (o tych procesach mo\u017cna dok\u0142adniej przeczyta\u0107 w odpowiednich artyku\u0142ach dokumentacji: <noindex><a rel=\"nofollow\" href=\"https:\/\/werf.io\/documentation\/reference\/publish_process.html\">Proces publikacji<\/a><\/noindex> i <noindex><a rel=\"nofollow\" href=\"https:\/\/werf.io\/documentation\/reference\/deploy_process\/deploy_into_kubernetes.html\">Proces wdra\u017cania<\/a><\/noindex>), to tryb jednoznacznie okre\u015bla wzorzec, wed\u0142ug kt\u00f3rego mo\u017cna pracowa\u0107 z obrazem.<\/p>\n<h3>Diabe\u0142 tkwi w szczeg\u00f3\u0142ach<\/h3>\n<p>\nR\u00f3\u017cnica i g\u0142\u00f3wna trudno\u015b\u0107 przy dodawaniu nowego sposobu przechowywania \u2014 to proces czyszczenia registry <i>(mo\u017cliwo\u015bci czyszczenia dost\u0119pne w werf, patrz w <noindex><a rel=\"nofollow\" href=\"https:\/\/werf.io\/documentation\/reference\/cleaning_process.html\">Proces czyszczenia<\/a><\/noindex>)<\/i>.<\/p>\n<p>Przy czyszczeniu werf bierze pod uwag\u0119 obrazy u\u017cywane w klastrach Kubernetes, a tak\u017ce polityki ustalane przez u\u017cytkownika. Podstaw\u0105 polityk jest rozdzielenie tag\u00f3w na strategie. Strategie obecnie wspierane to:<\/p>\n<ol>\n<li> 3 strategie zwi\u0105zane z prymitywami Git, takimi jak tag, ga\u0142\u0105\u017a i commit;<\/li>\n<li> 1 strategia dla dowolnych, u\u017cytkowniczych tag\u00f3w.<\/li>\n<\/ol>\n<p>\nInformacje o strategii tagu przechowujemy przy publikacji obrazu w etykietach ko\u0144cowego obrazu. Sama warto\u015b\u0107 \u2014 tak zwany <b>metatag<\/b> \u2014 jest niezb\u0119dna do stosowania cz\u0119\u015bci polityk. Na przyk\u0142ad, przy usuwaniu ga\u0142\u0119zi lub tagu z repozytorium Git logiczne jest usun\u0105\u0107 tak\u017ce powi\u0105zane <i>niewykorzystywane<\/i> obrazy z rejestru, co jest obj\u0119te cz\u0119\u015bci\u0105 naszych polityk.<\/p>\n<p>Przy zachowaniu w jednym repozytorium (<code>monorepo<\/code>), w tagu obrazu, poza metatagiem, mo\u017ce by\u0107 r\u00f3wnie\u017c przechowywana nazwa obrazu: <code>PROJEKT:<b>frontend<\/b>-META-TAG<\/code>. Aby je oddzieli\u0107, nie wprowadzali\u015bmy \u017cadnego specyficznego separatora, tylko dodali\u015bmy niezb\u0119dn\u0105 warto\u015b\u0107 do etykiety ko\u0144cowego obrazu podczas publikacji.<\/p>\n<p><i><b>NB<\/b>: Je\u015bli chcesz zobaczy\u0107 wszystko, co opisano w kodzie \u017ar\u00f3d\u0142owym werf, punkt wyj\u015bcia mo\u017ce stanowi\u0107 <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/flant\/werf\/pull\/1684\/files\">PR 1684<\/a><\/noindex>.<\/i><\/p>\n<p>W tym artykule nie b\u0119dziemy po\u015bwi\u0119ca\u0107 wi\u0119cej uwagi problematyce oraz uzasadnieniu naszego podej\u015bcia: na temat strategii tagowania, przechowywania danych w etykietach i procesu publikacji jako ca\u0142o\u015bci \u2014 wszystko to zosta\u0142o szczeg\u00f3\u0142owo opisane w niedawnym wyst\u0105pieniu Dmitrija Stoljarowa: \u201e<noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/flant\/blog\/460351\/\">werf \u2014 nasze narz\u0119dzie do CI\/CD w Kubernetes<\/a><\/noindex>\u00bb.<\/p>\n<h2>Podsumowuj\u0105c,<\/h2>\n<p>\nBrak wsparcia dla rejestr\u00f3w bez zagnie\u017cd\u017cenia nie stanowi\u0142 dla nas ani dla znanych nam u\u017cytkownik\u00f3w werf czynnika blokuj\u0105cego \u2014 zawsze mo\u017cna by\u0142o utworzy\u0107 oddzielny rejestr obraz\u00f3w (lub przej\u015b\u0107 na tzw. Container Registry w Google Cloud)... Jednak zniesienie takiego ograniczenia wydawa\u0142o si\u0119 logiczne, aby narz\u0119dzie by\u0142o bardziej przyjazne szerszemu spo\u0142eczno\u015bci DevOps. Wprowadzaj\u0105c to, napotkali\u015bmy g\u0142\u00f3wn\u0105 trudno\u015b\u0107 w przetwarzaniu mechanizmu czyszczenia rejestru kontener\u00f3w. Teraz, gdy wszystko jest gotowe, mi\u0142o jest wiedzie\u0107, \u017ce komu\u015b sta\u0142o si\u0119 \u0142atwiej, a my (jako g\u0142\u00f3wni programi\u015bci projektu) nie przewidujemy znacz\u0105cych trudno\u015bci w dalszym wsparciu tej funkcji.<\/p>\n<p>Pozosta\u0144 z nami, a wkr\u00f3tce opowiemy o innych nowo\u015bciach w <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/flant\/werf\">werf<\/a><\/noindex>!<\/p>\n<h2>P.S.<\/h2>\n<p>\nPrzeczytaj tak\u017ce na naszym blogu:<\/p>\n<ul>\n<li> \u00ab<noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/flant\/blog\/463613\/\">Budowanie obraz\u00f3w Docker w werf jest teraz mo\u017cliwe r\u00f3wnie\u017c za pomoc\u0105 zwyk\u0142ego Dockerfile<\/a><\/noindex>\u00bb;<\/li>\n<li> \u00ab<noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/flant\/blog\/460351\/\">werf \u2014 nasze narz\u0119dzie do CI\/CD w Kubernetes (przegl\u0105d i wideo wyk\u0142adu)<\/a><\/noindex>\u00bb.<\/li>\n<\/ul>\n<p>\u0179r\u00f3d\u0142o: <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/flant\/blog\/465131\/\">habr.com<\/a><\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>\u0422\u0435\u043c\u0430 \u043c\u043e\u043d\u043e\u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u044f \u043e\u0431\u0441\u0443\u0436\u0434\u0430\u043b\u0430\u0441\u044c \u0443\u0436\u0435 \u043d\u0435 \u0440\u0430\u0437 \u0438, \u043a\u0430\u043a \u043f\u0440\u0430\u0432\u0438\u043b\u043e, \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442 \u0432\u0435\u0441\u044c\u043c\u0430 \u0430\u043a\u0442\u0438\u0432\u043d\u044b\u0435 \u0441\u043f\u043e\u0440\u044b. \u0421\u043e\u0437\u0434\u0430\u0432\u0430\u044f werf \u043a\u0430\u043a Open Source-\u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442, \u043f\u0440\u0438\u0437\u0432\u0430\u043d\u043d\u044b\u0439 \u0443\u043b\u0443\u0447\u0448\u0438\u0442\u044c \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u044b \u0441\u0431\u043e\u0440\u043a\u0438 \u043a\u043e\u0434\u0430 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439 \u0438\u0437 Git \u0432 Docker-\u043e\u0431\u0440\u0430\u0437\u044b (\u0438 \u0438\u0445 \u043f\u043e\u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0439 \u0434\u043e\u0441\u0442\u0430\u0432\u043a\u0438 \u0432 Kubernetes), \u043c\u044b \u043c\u0430\u043b\u043e \u0440\u0430\u0437\u043c\u044b\u0448\u043b\u044f\u0435\u043c \u043d\u0430 \u0442\u0435\u043c\u0443 \u0442\u043e\u0433\u043e, \u043a\u0430\u043a\u043e\u0439 \u0432\u044b\u0431\u043e\u0440 \u043b\u0443\u0447\u0448\u0435. \u0414\u043b\u044f \u043d\u0430\u0441 \u043f\u0435\u0440\u0432\u0438\u0447\u043d\u043e \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0438\u0442\u044c \u0432\u0441\u0451 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0435 \u0434\u043b\u044f \u0441\u0442\u043e\u0440\u043e\u043d\u043d\u0438\u043a\u043e\u0432 \u0440\u0430\u0437\u043d\u044b\u0445 \u043c\u043d\u0435\u043d\u0438\u0439 (\u0435\u0441\u043b\u0438 \u044d\u0442\u043e [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":28270,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[688],"tags":[],"class_list":["post-37667","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.1.1 - aioseo.com -->\n\t<meta name=\"description\" content=\"\u0422\u0435\u043c\u0430 \u043c\u043e\u043d\u043e\u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u044f.\" \/>\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\/pl\/blog\/administrirovanie\/podderzhka-monorepo-i-multirepo-v-werf-i-pri-chyom-zdes-docker-registry\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.1.1\" \/>\n\t\t<meta property=\"og:locale\" content=\"pl_PL\" \/>\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\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0430 monorepo \u0438 multirepo \u0432 werf \u0438 \u043f\u0440\u0438 \u0447\u0451\u043c \u0437\u0434\u0435\u0441\u044c Docker Registry | ProHoster\" \/>\n\t\t<meta property=\"og:description\" content=\"\u0422\u0435\u043c\u0430 \u043c\u043e\u043d\u043e\u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u044f.\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/pl\/blog\/administrirovanie\/podderzhka-monorepo-i-multirepo-v-werf-i-pri-chyom-zdes-docker-registry\" \/>\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=\"2019-10-31T19:18:58+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2019-10-31T19:18:58+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\udd47Wsparcie dla monorepo i multirepo w werf i co ma z tym wsp\u00f3lnego Docker Registry | ProHoster","description":"Temat monorepo.","canonical_url":"https:\/\/prohoster.info\/pl\/blog\/administrirovanie\/podderzhka-monorepo-i-multirepo-v-werf-i-pri-chyom-zdes-docker-registry","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"pl_PL","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\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0430 monorepo \u0438 multirepo \u0432 werf \u0438 \u043f\u0440\u0438 \u0447\u0451\u043c \u0437\u0434\u0435\u0441\u044c Docker Registry | ProHoster","og:description":"\u0422\u0435\u043c\u0430 \u043c\u043e\u043d\u043e\u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u044f.","og:url":"https:\/\/prohoster.info\/pl\/blog\/administrirovanie\/podderzhka-monorepo-i-multirepo-v-werf-i-pri-chyom-zdes-docker-registry","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":"2019-10-31T19:18:58+00:00","article:modified_time":"2019-10-31T19:18:58+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"37667","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":"2026-01-23 18:48:19","breadcrumb_settings":null,"limit_modified_date":false,"reviewed_by":null,"ai":null,"created":"2021-03-01 01:22:29","updated":"2026-01-23 18:48:19","focus_keyword":null,"additional_keywords":null,"truseo_locale":null},"gt_translate_keys":[{"key":"link","format":"url"}],"_links":{"self":[{"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/posts\/37667","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/comments?post=37667"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/posts\/37667\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/media\/28270"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/media?parent=37667"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/categories?post=37667"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/tags?post=37667"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}