{"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\/cs\/blog\/administrirovanie\/podderzhka-monorepo-i-multirepo-v-werf-i-pri-chyom-zdes-docker-registry","title":{"rendered":"Podpora monorepo a multirepo v werf a jak to souvis\u00ed s Docker Registry","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"Podpora monorepo a multirepo v werf a jak to souvis\u00ed s Docker Registry\" src=\"\/wp-content\/uploads\/2019\/09\/7bd2036d8e53b04965212698a209d4c7.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nT\u00e9ma monorepo bylo ji\u017e mnohokr\u00e1t diskutov\u00e1no a obvykle vyvol\u00e1v\u00e1 velmi aktivn\u00ed debaty. Kdy\u017e vytv\u00e1\u0159\u00edme <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/flant\/werf\">werf<\/a><\/noindex> jako Open Source n\u00e1stroj, kter\u00fd m\u00e1 zlep\u0161it procesy sestaven\u00ed k\u00f3du aplikac\u00ed z Git do Docker obraz\u016f (a jejich n\u00e1sledn\u00e9ho dod\u00e1n\u00ed do Kubernetes), m\u00e1lo p\u0159em\u00fd\u0161l\u00edme o tom, jak\u00e1 volba je lep\u0161\u00ed. Na\u0161\u00edm prim\u00e1rn\u00edm c\u00edlem je poskytnout v\u0161echno pot\u0159ebn\u00e9 pro zast\u00e1nce r\u016fzn\u00fdch n\u00e1zor\u016f (pokud to samoz\u0159ejm\u011b nen\u00ed v rozporu se zdrav\u00fdm rozumem).<\/p>\n<p>Ned\u00e1vno se objevila podpora mono-repo ve werf \u2014 dobr\u00fd p\u0159\u00edklad toho. Ale nejprve si ujasn\u011bme, jak tato podpora vlastn\u011b souvis\u00ed s pou\u017e\u00edv\u00e1n\u00edm werf a co m\u00e1 spole\u010dn\u00e9ho s Docker Registry\u2026<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<h2>Problematika<\/h2>\n<p>\nP\u0159edstavme si takovou situaci. Ve firm\u011b je mnoho t\u00fdm\u016f v\u00fdvoj\u00e1\u0159\u016f, kte\u0159\u00ed pracuj\u00ed na nez\u00e1visl\u00fdch projektech. V\u011bt\u0161ina aplikac\u00ed funguje v Kubernetes, a tud\u00ed\u017e jsou kontejnerizov\u00e1ny. Pro ukl\u00e1d\u00e1n\u00ed kontejner\u016f a obraz\u016f je pot\u0159eba registr (registry). Jako takov\u00fd registr ve firm\u011b slou\u017e\u00ed Docker Hub s jedin\u00fdm \u00fa\u010dtem <code>COMPANY<\/code>. Podobn\u011b jako v\u011bt\u0161ina syst\u00e9m\u016f pro ukl\u00e1d\u00e1n\u00ed zdrojov\u00e9ho k\u00f3du, <b>Docker Hub neumo\u017e\u0148uje vytv\u00e1\u0159et vno\u0159enou hierarchii repozit\u00e1\u0159\u016f<\/b>, jako nap\u0159\u00edklad <code>COMPANY\/PROJECT\/IMAGE<\/code>. Jak tedy s t\u00edmto omezen\u00edm uchov\u00e1vat v registru nemonolitn\u00ed aplikace, ani\u017e bychom vytv\u00e1\u0159eli samostatn\u00fd \u00fa\u010det pro ka\u017ed\u00fd projekt? <\/p>\n<p><img decoding=\"async\" alt=\"Podpora monorepo a multirepo v werf a jak to souvis\u00ed s Docker Registry\" src=\"\/wp-content\/uploads\/2019\/09\/b7905fab48723a123bee536e1fe56c5a.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nMo\u017en\u00e1 je uveden\u00e1 situace n\u011bkomu zn\u00e1m\u00e1, ale poj\u010fme se pod\u00edvat na ot\u00e1zku organizace \u00falo\u017en\u00fdch syst\u00e9m\u016f aplikac\u00ed obecn\u011b, tedy bez vazby na v\u00fd\u0161e uveden\u00fd p\u0159\u00edklad a Docker Hub.<\/p>\n<h3>Mo\u017enosti \u0159e\u0161en\u00ed<\/h3>\n<p>\nPokud je aplikace <b>monolitn\u00ed<\/b>, dod\u00e1v\u00e1 se v jednom obraze, pak nen\u00ed \u017e\u00e1dn\u00fd probl\u00e9m a jednodu\u0161e uchov\u00e1v\u00e1me obrazy v registru kontejner\u016f projektu.<\/p>\n<p>Kdy\u017e je aplikace p\u0159edstavena jako n\u011bkolik komponent\u016f, <b>mikroslu\u017eby<\/b>, je t\u0159eba zvolit ur\u010ditou strategii. Na p\u0159\u00edkladu typick\u00e9 webov\u00e9 aplikace, kter\u00e1 se skl\u00e1d\u00e1 ze dvou obraz\u016f: <code>frontend<\/code> a <code>backend<\/code> \u2014 mo\u017en\u00e9 varianty jsou n\u00e1sleduj\u00edc\u00ed:<\/p>\n<ol>\n<li> Ukl\u00e1dat obrazy v samostatn\u00fdch vno\u0159en\u00fdch repozit\u00e1\u0159\u00edch:\n<p><img decoding=\"async\" alt=\"Podpora monorepo a multirepo v werf a jak to souvis\u00ed s Docker Registry\" src=\"\/wp-content\/uploads\/2019\/09\/a05bfdaec10ea7b4542200c6a2bb4939.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/li>\n<li> Ukl\u00e1dat v\u0161e v jednom repozit\u00e1\u0159i a n\u00e1zev obrazu zohled\u0148ovat v tagu, nap\u0159\u00edklad n\u00e1sleduj\u00edc\u00edm zp\u016fsobem:\n<p><img decoding=\"async\" alt=\"Podpora monorepo a multirepo v werf a jak to souvis\u00ed s 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>: Existuje tak\u00e9 dal\u0161\u00ed mo\u017enost s ukl\u00e1d\u00e1n\u00edm v r\u016fzn\u00fdch repozit\u00e1\u0159\u00edch, <code>PROJECT-frontend<\/code> a <code>PROJECT-backend<\/code>, ale tu nebudeme rozeb\u00edrat kv\u016fli slo\u017eitosti podpory, organizace a rozd\u011blen\u00ed pr\u00e1v mezi u\u017eivateli.<\/i><\/p>\n<h2>Podpora ve werf<\/h2>\n<p>\nZpo\u010d\u00e1tku werf pracoval pouze s vno\u0159en\u00fdmi repozit\u00e1\u0159i \u2014 na\u0161t\u011bst\u00ed v\u011bt\u0161ina registr\u016f tuto mo\u017enost podporuje. Od verze <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/flant\/werf\/releases\/tag\/v1.0.4-alpha.3\">v1.0.4-alpha.3<\/a><\/noindex>, byla p\u0159id\u00e1na podpora pro registry, kter\u00e9 <b>nepodporuj\u00ed vno\u0159enost<\/b>, a Docker Hub je jedn\u00edm z nich. Od t\u00e9 doby m\u011bl u\u017eivatel mo\u017enost vybrat, jak ukl\u00e1dat obrazov\u00e9 soubory aplikace.<\/p>\n<p>Implementace je dostupn\u00e1 v r\u00e1mci mo\u017enosti <code>--images-repo-mode=multirepo|monorepo<\/code> (v\u00fdchoz\u00ed hodnota je <code>multirepo<\/code>, tedy ukl\u00e1d\u00e1n\u00ed v vno\u0159en\u00fdch repozit\u00e1\u0159\u00edch). Ur\u010duje vzory, podle kter\u00fdch jsou obrazy ulo\u017eeny v registru. Sta\u010d\u00ed zvolit po\u017eadovan\u00fd re\u017eim p\u0159i pou\u017eit\u00ed z\u00e1kladn\u00edch p\u0159\u00edkaz\u016f, zbytek z\u016fstane nezm\u011bn\u011bn.<\/p>\n<p>Jeliko\u017e v\u011bt\u0161inu voleb werf lze nastavovat <b>pomoc\u00ed prom\u011bnn\u00fdch prost\u0159ed\u00ed<\/b>, v CI\/CD syst\u00e9m byl re\u017eim ukl\u00e1d\u00e1n\u00ed obvykle snadno nastavit glob\u00e1ln\u011b pro cel\u00fd projekt. Nap\u0159\u00edklad, <b>v p\u0159\u00edpad\u011b GitLab<\/b> sta\u010d\u00ed p\u0159idat prom\u011bnnou prost\u0159ed\u00ed v nastaven\u00ed projektu: <i>Nastaven\u00ed -&gt; CI \/ CD -&gt; Prom\u011bnn\u00e9: <code>WERF_IMAGES_REPO_MODE: multirepo|monorepo<\/code><\/i>.<\/p>\n<p>Pokud jde o publikaci obraz\u016f a nasazen\u00ed aplikac\u00ed (o t\u011bchto procesech si m\u016f\u017eete p\u0159e\u010d\u00edst podrobn\u011b v p\u0159\u00edslu\u0161n\u00fdch \u010dl\u00e1nc\u00edch dokumentace: <noindex><a rel=\"nofollow\" href=\"https:\/\/werf.io\/documentation\/reference\/publish_process.html\">Proces publikace<\/a><\/noindex> a <noindex><a rel=\"nofollow\" href=\"https:\/\/werf.io\/documentation\/reference\/deploy_process\/deploy_into_kubernetes.html\">Proces nasazen\u00ed<\/a><\/noindex>), re\u017eim v\u00fdhradn\u011b ur\u010duje vzor, podle kter\u00e9ho lze pracovat s obrazem.<\/p>\n<h3>\u010e\u00e1bel je v detailech<\/h3>\n<p>\nRozd\u00edl a hlavn\u00ed obt\u00ed\u017e p\u0159i p\u0159id\u00e1v\u00e1n\u00ed nov\u00e9ho zp\u016fsobu ukl\u00e1d\u00e1n\u00ed spo\u010d\u00edv\u00e1 v procesu \u010di\u0161t\u011bn\u00ed registry <i>(mo\u017enosti \u010di\u0161t\u011bn\u00ed podporovan\u00e9 ve werf, viz <noindex><a rel=\"nofollow\" href=\"https:\/\/werf.io\/documentation\/reference\/cleaning_process.html\">Proces \u010di\u0161t\u011bn\u00ed<\/a><\/noindex>)<\/i>.<\/p>\n<p>). P\u0159i \u010di\u0161t\u011bn\u00ed werf bere v \u00favahu obrazy pou\u017e\u00edvan\u00e9 v clusterech Kubernetes a tak\u00e9 politiky nastaven\u00e9 u\u017eivateli. Z\u00e1kladem politik je rozd\u011blen\u00ed tag\u016f na strategie. Moment\u00e1ln\u011b podporovan\u00e9 strategie jsou:<\/p>\n<ol>\n<li> 3 strategie spojen\u00e9 s Git primitivy, jako jsou tag, v\u011btev a commity;<\/li>\n<li> 1 strategie pro libovoln\u00e9 u\u017eivatelsk\u00e9 tagy.<\/li>\n<\/ol>\n<p>\nInformace o strategii tagu uchov\u00e1v\u00e1me p\u0159i publikaci obrazu v etiket\u00e1ch kone\u010dn\u00e9ho obrazu. Samotn\u00e1 hodnota \u2014 tzv. <b>metatag<\/b> \u2014 je pot\u0159ebn\u00e1 pro aplikaci \u010d\u00e1st\u00ed politik. Nap\u0159\u00edklad, p\u0159i odstra\u0148ov\u00e1n\u00ed v\u011btve nebo tagu z Git repozit\u00e1\u0159e je logick\u00e9 odstranit tak\u00e9 souvisej\u00edc\u00ed <i>nepou\u017e\u00edvan\u00e9<\/i> obrazy z registru, co\u017e pokr\u00fdv\u00e1 \u010d\u00e1st na\u0161ich politik.<\/p>\n<p>P\u0159i ukl\u00e1d\u00e1n\u00ed do jednoho repozit\u00e1\u0159e (<code>monorepo<\/code>), v tagu obrazu m\u016f\u017ee krom\u011b metatagu b\u00fdt tak\u00e9 ulo\u017eeno jm\u00e9no obrazu: <code>PROJEKT:<b>frontend<\/b>-META-TAG<\/code>. Pro jejich odd\u011blen\u00ed jsme nezavedli \u017e\u00e1dn\u00fd specifick\u00fd odd\u011blova\u010d, ale jednodu\u0161e jsme p\u0159idali po\u017eadovanou hodnotu do popisu koncov\u00e9ho obrazu p\u0159i publikaci.<\/p>\n<p><i><b>NB<\/b>: Pokud m\u00e1te z\u00e1jem pod\u00edvat se na v\u0161e popsan\u00e9 v zdrojov\u00e9m k\u00f3du werf, m\u016f\u017ee b\u00fdt v\u00fdchoz\u00edm bodem <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/flant\/werf\/pull\/1684\/files\">PR 1684<\/a><\/noindex>.<\/i><\/p>\n<p>V tomto \u010dl\u00e1nku se nebudeme d\u00e1le zab\u00fdvat problematikou a od\u016fvodn\u011bn\u00edm na\u0161eho p\u0159\u00edstupu: o strategi\u00edch ozna\u010dov\u00e1n\u00ed, ukl\u00e1d\u00e1n\u00ed dat v popisech a procesu publikace jako celku \u2014 o tom v\u0161em bylo podrobn\u011b pojedn\u00e1no v ned\u00e1vn\u00e9 p\u0159edn\u00e1\u0161ce Dmitrije Stojarova: \u201e<noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/flant\/blog\/460351\/\">werf - n\u00e1\u0161 n\u00e1stroj pro CI\/CD v Kubernetes<\/a><\/noindex>\u00bb.<\/p>\n<h2>Shrnuto<\/h2>\n<p>\nNedostatek podpory registr\u016f bez vno\u0159en\u00ed nebyl blokuj\u00edc\u00edm faktorem pro n\u00e1s ani pro zn\u00e1m\u00e9 u\u017eivatele werf \u2014 v\u017edy je mo\u017en\u00e9 zprovoznit samostatn\u00fd registr obraz\u016f (nebo p\u0159ej\u00edt na jak\u00fdsi Container Registry v Google Cloud)... Nicm\u00e9n\u011b, zru\u0161en\u00ed takov\u00e9ho omezen\u00ed se zd\u00e1lo logick\u00e9, aby byl n\u00e1stroj pohodln\u011bj\u0161\u00ed pro \u0161ir\u0161\u00ed DevOps komunitu. P\u0159i jeho implementaci jsme narazili na hlavn\u00ed obt\u00ed\u017enost p\u0159i p\u0159epracov\u00e1n\u00ed mechanismu \u010di\u0161t\u011bn\u00ed registru kontejner\u016f. Nyn\u00ed, kdy\u017e je v\u0161e hotovo, je pot\u011b\u0161uj\u00edc\u00ed v\u011bd\u011bt, \u017ee to n\u011bkomu usnadnilo pr\u00e1ci a n\u00e1m (jako hlavn\u00edm v\u00fdvoj\u00e1\u0159\u016fm projektu) se v budoucnosti nejev\u00ed \u017e\u00e1dn\u00e9 v\u00fdznamn\u00e9 obt\u00ed\u017ee p\u0159i dal\u0161\u00ed podpo\u0159e t\u00e9to funkce.<\/p>\n<p>Z\u016fsta\u0148te s n\u00e1mi a brzy v\u00e1m pov\u00edme o dal\u0161\u00edch novink\u00e1ch v <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/flant\/werf\">werf<\/a><\/noindex>!<\/p>\n<h2>P.S.<\/h2>\n<p>\nP\u0159e\u010dt\u011bte si tak\u00e9 n\u00e1\u0161 blog:<\/p>\n<ul>\n<li> \u00ab<noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/flant\/blog\/463613\/\">Sestavovat Docker obrazy v werf nyn\u00ed lze i podle b\u011b\u017en\u00e9ho Dockerfile<\/a><\/noindex>\u00bb;<\/li>\n<li> \u00ab<noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/flant\/blog\/460351\/\">werf \u2014 n\u00e1\u0161 n\u00e1stroj pro CI\/CD v Kubernetes (p\u0159ehled a video p\u0159edn\u00e1\u0161ky)<\/a><\/noindex>\u00bb.<\/li>\n<\/ul>\n<p>Zdroj: <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.3 - 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\/cs\/blog\/administrirovanie\/podderzhka-monorepo-i-multirepo-v-werf-i-pri-chyom-zdes-docker-registry\" \/>\n\t\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.3\" \/>\n\t\t<meta property=\"og:locale\" content=\"cs_CZ\" \/>\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\/cs\/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\udd47Podpora monorepo a multirepo v werf a jak to souvis\u00ed s Docker Registry | ProHoster","description":"T\u00e9ma monorepozit\u00e1\u0159e.","canonical_url":"https:\/\/prohoster.info\/cs\/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":"cs_CZ","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\/cs\/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\/cs\/wp-json\/wp\/v2\/posts\/37667","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/comments?post=37667"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/posts\/37667\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/media\/28270"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/media?parent=37667"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/categories?post=37667"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/tags?post=37667"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}