{"id":52071,"date":"2020-02-18T05:34:24","date_gmt":"2020-02-18T02:34:24","guid":{"rendered":"https:\/\/prohoster.info\/blog\/blog_prohoster\/horosho-podumajte-prezhde-chem-ispolzovat-docker-in-docker-dlya-ci-ili-testovoj-sredy"},"modified":"2020-02-18T05:34:24","modified_gmt":"2020-02-18T02:34:24","slug":"horosho-podumajte-prezhde-chem-ispolzovat-docker-in-docker-dlya-ci-ili-testovoj-sredy","status":"publish","type":"post","link":"https:\/\/prohoster.info\/sq\/blog\/horosho-podumajte-prezhde-chem-ispolzovat-docker-in-docker-dlya-ci-ili-testovoj-sredy","title":{"rendered":"Mendoni mir\u00eb p\u00ebrpara se t\u00eb p\u00ebrdorni Docker-in-Docker p\u00ebr CI ose ambient testimi","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"Mendoni mir\u00eb p\u00ebrpara se t\u00eb p\u00ebrdorni Docker-in-Docker p\u00ebr CI ose ambient testimi\" src=\"\/wp-content\/uploads\/2020\/02\/50b03664f1984b36e1703717dfaa7ecc.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nDocker-in-Docker \u00ebsht\u00eb nj\u00eb mjedis i virtualizuar Docker-daemon, i cili ekzekutohet brenda vet\u00eb kontejnerit p\u00ebr nd\u00ebrtimin e imazheve t\u00eb kontejnerit. Q\u00ebllimi kryesor i krijimit t\u00eb Docker-in-Docker ishte t\u00eb ndihmonte n\u00eb zhvillimin e vet\u00eb Docker. Shum\u00eb njer\u00ebz e p\u00ebrdorin at\u00eb p\u00ebr t\u00eb drejtuar Jenkins CI. N\u00eb fillim duket normale, por pastaj lindin probleme q\u00eb mund t\u00eb shmangen duke instaluar Docker n\u00eb kontejnerin Jenkins CI. Ky artikull shpjegon se si ta b\u00ebni k\u00ebt\u00eb. N\u00ebse jeni t\u00eb interesuar p\u00ebr zgjidhjen p\u00ebrfundimtare pa detaje, thjesht lexoni seksionin e fundit t\u00eb artikullit \"Zgjidhja e problemit\".<\/p>\n<p><img decoding=\"async\" alt=\"Mendoni mir\u00eb p\u00ebrpara se t\u00eb p\u00ebrdorni Docker-in-Docker p\u00ebr CI ose ambient testimi\" src=\"\/wp-content\/uploads\/2020\/02\/0fdafa0c0a1768170cff52333e733314.png\" style=\"display:block;margin: 0 auto;\" \/><noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<h3>Docker-in-Docker: \"I Mir\u00eb\"<\/h3>\n<p>\nM\u00eb shum\u00eb se dy vjet m\u00eb par\u00eb, un\u00eb kam vendosur n\u00eb Docker <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/moby\/moby\/commit\/280901e5fbd0c2dabd14d7a9b69a073f6e8f87e4\">--all<\/a><\/noindex> --privileged dhe shkrova <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/jpetazzo\/dind\/commit\/bfbe19c0eec634f66c9f8bac53c6b7c7e0fdb063\">versionin e par\u00eb dind<\/a><\/noindex>. Q\u00ebllimi ishte t\u00eb ndihmonte ekipin kryesor t\u00eb zhvillonte Docker m\u00eb shpejt. Para se t\u00eb kishte Docker-in-Docker, cikli tipik i zhvillimit ishte k\u00ebshtu:<\/p>\n<ul>\n<li>hackity hack;<\/li>\n<li>nd\u00ebrtimi (build);<\/li>\n<li>ndalimi i Docker-daemonit t\u00eb ekzekutuar;<\/li>\n<li>ekzekutimi i nj\u00eb Docker-daemoni t\u00eb ri;<\/li>\n<li>testimi;<\/li>\n<li>riprojci; eksperimentimi.<\/li>\n<\/ul>\n<p>\nN\u00ebse d\u00ebshironit t\u00eb b\u00ebni nj\u00eb nd\u00ebrtim t\u00eb bukur dhe t\u00eb riprodhuesh\u00ebm (dmth. brenda kontejnerit), at\u00ebher\u00eb b\u00ebhej m\u00eb e komplikuar:<\/p>\n<ul>\n<li>hackity hack;<\/li>\n<li>t\u00eb siguroheni q\u00eb t\u00eb keni nj\u00eb version funksional t\u00eb Docker;<\/li>\n<li>t\u00eb nd\u00ebrtosh nj\u00eb Docker t\u00eb ri me Docker-in e vjet\u00ebr;<\/li>\n<li>ndaleni Docker-daemonin;<\/li>\n<li>ekzekutoni nj\u00eb Docker-daemon t\u00eb ri;<\/li>\n<li>testoni;<\/li>\n<li>ndaloni Docker-daemonin e ri;<\/li>\n<li>p\u00ebrs\u00ebritni.<\/li>\n<\/ul>\n<p>\nMe ardhjen e Docker-in-Docker, procesi u thjeshtua:<\/p>\n<ul>\n<li>hackity hack;<\/li>\n<li>nd\u00ebrtimi + ekzekutimi n\u00eb nj\u00eb hap;<\/li>\n<li>riprojci; eksperimentimi.<\/li>\n<\/ul>\n<p>\nA nuk \u00ebsht\u00eb k\u00ebshtu shum\u00eb m\u00eb mir\u00eb?<\/p>\n<p><img decoding=\"async\" alt=\"Mendoni mir\u00eb p\u00ebrpara se t\u00eb p\u00ebrdorni Docker-in-Docker p\u00ebr CI ose ambient testimi\" src=\"\/wp-content\/uploads\/2020\/02\/b4870536068c660a8d996ec53f079504.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<\/p>\n<h3>Docker-in-Docker: \"I Keq\"<\/h3>\n<p>\nMegjithat\u00eb, p\u00ebrkund\u00ebr mendimit t\u00eb zakonsh\u00ebm, Docker-in-Docker nuk \u00ebsht\u00eb 100% e b\u00ebr\u00eb nga yje, ponies dhe nj\u00ebhorna. Po flas p\u00ebr disa probleme q\u00eb zhvilluesi duhet t\u2019i dij\u00eb.<\/p>\n<p>Nj\u00eb nga to ka t\u00eb b\u00ebj\u00eb me LSM (modulet e siguris\u00eb Linux), si AppArmor dhe SELinux: kur nisni nj\u00eb kontejner, \"Docker-i brendsh\u00ebm\" mund t\u00eb p\u00ebrpiqet t\u00eb aplikoj\u00eb profile sigurie q\u00eb do t\u00eb bien n\u00eb konflikt ose do t\u00eb ngat\u00ebrrojn\u00eb \"Docker-in e jasht\u00ebm\". Ky \u00ebsht\u00eb problemi m\u00eb i v\u00ebshtir\u00eb q\u00eb duhet zgjidhur kur p\u00ebrpiqeni t\u00eb bashkoni implementimin origjinal t\u00eb flamurit \u2013privileged. Ndryshimet e mia funksionuan, dhe t\u00eb gjitha testet do t\u00eb kalonin n\u00eb makin\u00ebn time Debian dhe n\u00eb makinat virtuale testuese Ubuntu, por do t\u00eb kolapsin dhe do t\u00eb digj\u00ebn n\u00eb makin\u00ebn e Maikll Krosbit (sa m\u00eb kujtohet, ai kishte Fedora). Nuk mund t\u00eb kujtoj shkakun e sakt\u00eb t\u00eb problemit, por ndoshta ndodhi sepse Maik \u00ebsht\u00eb nj\u00eb njeri i men\u00e7ur, i cili punon me SELINUX=enforce (un\u00eb p\u00ebrdora AppArmor), dhe ndryshimet e mia nuk e merrnin parasysh profilin SELinux.<\/p>\n<h3>Docker-in-Docker: \"E keqe\"<\/h3>\n<p>\nProblemi i dyt\u00eb ka t\u00eb b\u00ebj\u00eb me drejtuesit e ruajtjes s\u00eb Docker. Kur nisni Docker-in-Docker, Docker-i i jasht\u00ebm funksionon mbi nj\u00eb sistem t\u00eb zakonsh\u00ebm skedari (EXT4, BTRFS ose \u00e7far\u00ebdo tjet\u00ebr q\u00eb keni), nd\u00ebrsa Docker-i brendsh\u00ebm funksionon mbi sistemin e kopjimit n\u00eb shkrim (AUFS, BTRFS, Device Mapper, etj., n\u00eb var\u00ebsi t\u00eb asaj \u00e7far\u00eb \u00ebsht\u00eb konfiguruar t\u00eb p\u00ebrdoret nga Docker-i i jasht\u00ebm). Kjo sjell shum\u00eb kombinime q\u00eb nuk do t\u00eb funksionojn\u00eb. P\u00ebr shembull, nuk do t\u00eb mund t\u00eb ekzekutoni AUFS mbi AUFS. <\/p>\n<p>N\u00ebse po p\u00ebrdorni BTRFS mbi BTRFS, fillimisht duhet t\u00eb funksionoj\u00eb, por sa m\u00eb shum\u00eb n\u00ebnkategorit\u00eb t\u00eb krijohen, nuk do t\u00eb mund t\u00eb hiqni n\u00ebnkategorin\u00eb prind parent subvolume. Moduli Device Mapper nuk ka hap\u00ebsira em\u00ebrtimi, prandaj, n\u00ebse disa instanca Docker-i e p\u00ebrdorin at\u00eb n\u00eb t\u00eb nj\u00ebjt\u00ebn makin\u00eb, t\u00eb gjitha do t\u00eb jen\u00eb n\u00eb gjendje t\u00eb shohin (dhe t\u00eb ndikojn\u00eb n\u00eb) imazhet e nj\u00ebri-tjetrit dhe t\u00eb pajisjet e kopjimit t\u00eb kontejner\u00ebve. Kjo \u00ebsht\u00eb keq.<\/p>\n<p>Ekzistojn\u00eb rrug\u00eb alternative p\u00ebr zgjidhjen e shum\u00eb prej k\u00ebtyre problemeve. P\u00ebr shembull, n\u00ebse d\u00ebshironi t\u00eb p\u00ebrdorni AUFS n\u00eb Docker-in e brendsh\u00ebm, thjesht shnd\u00ebrroni dosjen \/var\/lib\/docker n\u00eb at\u00eb, dhe gjith\u00e7ka do t\u00eb jet\u00eb n\u00eb rregull. Docker ka shtuar disa hap\u00ebsira em\u00ebrtimi baz\u00eb n\u00eb emrat e synuar t\u00eb Device Mapper, k\u00ebshtu q\u00eb n\u00ebse disa thirrje Docker-i realizohen n\u00eb t\u00eb nj\u00ebjt\u00ebn makin\u00eb, ato nuk do t\u00eb \"shkelin\" nj\u00ebra-tjetr\u00ebn.<\/p>\n<p>Megjithat\u00eb, nj\u00eb konfigurim i till\u00eb nuk \u00ebsht\u00eb fare i leht\u00eb, si\u00e7 mund ta shihni nga k\u00ebta <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/jpetazzo\/dind\/issues\/78\">artikull<\/a><\/noindex> n\u00eb repo dind n\u00eb GitHub.<\/p>\n<h3>Docker-in-Docker: b\u00ebhet edhe m\u00eb keq<\/h3>\n<p>\n\u00c7far\u00eb ndodh me cache-n e nd\u00ebrtimit? Kjo gjithashtu mund t\u00eb jet\u00eb mjaft e komplikuar. Njer\u00ebzit shpesh m\u00eb pyesin, \u201cn\u00ebse po p\u00ebrdor Docker-in-Docker, si mund t\u00eb p\u00ebrdor imazhet q\u00eb ndodhen n\u00eb host-in tim, p\u00ebrve\u00e7 se t\u00eb rikthej gjith\u00e7ka n\u00eb Docker-in tim t\u00eb brendsh\u00ebm\u201d?<\/p>\n<p>Disa njer\u00ebz t\u00eb nd\u00ebrmarr\u00eb kan\u00eb provuar t\u00eb lidhin \/var\/lib\/docker nga host-i n\u00eb kontejnerin Docker-in-Docker. Ndonj\u00ebher\u00eb ata ndajn\u00eb \/var\/lib\/docker me disa kontejner\u00eb.<\/p>\n<p><img decoding=\"async\" alt=\"Mendoni mir\u00eb p\u00ebrpara se t\u00eb p\u00ebrdorni Docker-in-Docker p\u00ebr CI ose ambient testimi\" src=\"\/wp-content\/uploads\/2020\/02\/192c9d26798d32078272aab1864bbccb.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<i>Doni t\u00eb d\u00ebmtoni t\u00eb dh\u00ebnat? Sepse kjo \u00ebsht\u00eb pik\u00ebrisht ajo q\u00eb do t\u00eb d\u00ebmtoj\u00eb t\u00eb dh\u00ebnat tuaja!<\/i><\/p>\n<p>Docker-daemon ishte qart\u00ebsisht i dizajnuar p\u00ebr t\u00eb pasur qasje ekskluzive n\u00eb \/var\/lib\/docker. Asgj\u00eb tjet\u00ebr nuk duhet \"t\u00eb prek\u00eb, t\u00eb b\u00ebj\u00eb thirrje ose t\u00eb shqet\u00ebsoj\u00eb\" skedat e Docker-it q\u00eb ndodhen n\u00eb k\u00ebt\u00eb dosje.<\/p>\n<p>Pse \u00ebsht\u00eb k\u00ebshtu? Sepse kjo \u00ebsht\u00eb nj\u00eb nga m\u00ebsimet m\u00eb t\u00eb v\u00ebshtira q\u00eb m\u00ebsuam gjat\u00eb zhvillimit t\u00eb dotCloud. Motori i kontejner\u00ebve dotCloud funksiononte me disa procese q\u00eb aksesonin paralelisht \/var\/lib\/dotcloud. Hile t\u00eb tilla si z\u00ebvend\u00ebsimi atomik i skedar\u00ebve (n\u00eb vend t\u00eb editimit n\u00eb vend), \"shp\u00ebrndarja\" e kodit me bllokime rekomanduese dhe t\u00eb detyrueshme dhe eksperimente t\u00eb tjera me sisteme t\u00eb sigurta si SQLite dhe BDB, nuk funksiononin gjithmon\u00eb. Kur ne ri-dizajnua mekanizmin ton\u00eb t\u00eb kontejner\u00ebve, i cili p\u00ebrfundimisht u shnd\u00ebrrua n\u00eb Docker, nj\u00eb nga vendimet kryesore t\u00eb dizajnit ishte t\u00eb grumbulloheshin t\u00eb gjitha operacionet me kontejner\u00ebt n\u00ebn nj\u00eb daemon t\u00eb vet\u00ebm, p\u00ebr t\u00eb p\u00ebrfunduar t\u00eb gjith\u00eb k\u00ebt\u00eb budallall\u00ebk t\u00eb qasjes s\u00eb p\u00ebrbashk\u00ebt.<\/p>\n<p>Mos m\u00eb kuptoni gabim: \u00ebsht\u00eb e mundur t\u00eb b\u00ebni di\u00e7ka t\u00eb mir\u00eb, t\u00eb besueshme dhe t\u00eb shpejt\u00eb, q\u00eb p\u00ebrfshin disa procese dhe menaxhim modern paralel. Por ne mendojm\u00eb se \u00ebsht\u00eb m\u00eb e thjesht\u00eb dhe m\u00eb e leht\u00eb t\u00eb shkruani dhe mbani kod duke p\u00ebrdorur Docker si lojtarin e vet\u00ebm.<\/p>\n<p>Kjo do t\u00eb thot\u00eb se n\u00ebse ndani katalogun \/var\/lib\/docker midis disa instancave t\u00eb Docker-it, do t\u00eb keni probleme. Sigurisht, kjo mund t\u00eb funksionoj\u00eb, ve\u00e7an\u00ebrisht n\u00eb fazat e hershme t\u00eb testimit. \u201cD\u00ebgjo, mama, un\u00eb mund ta nisim ubuntu me \u2018docker\u2019!\u201d Por provoni t\u00eb b\u00ebni di\u00e7ka m\u00eb t\u00eb komplikuar, si t\u00eb nxirrni t\u00eb nj\u00ebjtin imazh nga dy instanca t\u00eb krijuara ndaras dhe do t\u00eb shihni si digjet bota.<\/p>\n<p>Kjo do t\u00eb thot\u00eb se n\u00ebse sistemi juaj CI b\u00ebn nd\u00ebrtesa dhe rindezje, \u00e7do her\u00eb kur ristartoni kontejnerin Docker-in-Docker rrezikoni t\u00eb riktheni n\u00eb cache nj\u00eb bomb\u00eb b\u00ebrthamore. Kjo nuk \u00ebsht\u00eb aspak e k\u00ebndshme!<\/p>\n<h3>Zgjidhja e problemit<\/h3>\n<p>\nLe t\u00eb b\u00ebjm\u00eb nj\u00eb hap prapa. A ju nevojitet v\u00ebrtet Docker-in-Docker apo thjesht doni t\u00eb keni mund\u00ebsin\u00eb t\u00eb drejtoni Docker, dometh\u00ebn\u00eb t\u00eb nd\u00ebrtoni dhe ekzekutoni kontejner\u00eb dhe imazhe nga sistemi juaj CI, nd\u00ebrsa vet\u00eb ky sistem CI \u00ebsht\u00eb n\u00eb nj\u00eb kontejner?<\/p>\n<p>Beso se shumic\u00ebs s\u00eb njer\u00ebzve u nevojitet opsioni i fundit, do t\u00eb thot\u00eb q\u00eb ata duan q\u00eb nj\u00eb sistem CI, si Jenkins, t\u00eb jet\u00eb n\u00eb gjendje t\u00eb drejtoj\u00eb kontejner\u00eb. Dhe m\u00ebnyra m\u00eb e thjesht\u00eb p\u00ebr ta b\u00ebr\u00eb k\u00ebt\u00eb \u00ebsht\u00eb thjesht t\u00eb vendosni socket-in e Docker n\u00eb kontejnerin tuaj CI, duke e lidhur at\u00eb me flagun -v.<\/p>\n<p>Th\u00ebn\u00eb thjesht, kur t\u00eb drejtoni kontejnerin tuaj CI (Jenkins ose ndonj\u00eb tjet\u00ebr), n\u00eb vend q\u00eb t\u00eb thyej di\u00e7ka bashk\u00eb me Docker-in-Docker, filloni at\u00eb me komand\u00ebn:<\/p>\n<pre><code class=\"plaintext\">docker run -v \/var\/run\/docker.sock:\/var\/run\/docker.sock ...<\/code><\/pre>\n<p>\nTani ky kontejner do t\u00eb ket\u00eb akses n\u00eb socket-in e Docker dhe, p\u00ebr pasoj\u00eb, do t\u00eb jet\u00eb n\u00eb gjendje t\u00eb drejtoj\u00eb kontejner\u00eb. P\u00ebrve\u00e7 se n\u00eb vend t\u00eb ekzekutimit t\u00eb kontejner\u00ebve \"f\u00ebmij\u00eb\" ai do t\u00eb drejtoj\u00eb kontejner\u00eb \"prind\u00ebr\".<\/p>\n<p>Provojeni k\u00ebt\u00eb, duke p\u00ebrdorur imazhin zyrtar docker (i cili p\u00ebrmban skedarin binar t\u00eb Docker):<\/p>\n<pre><code class=\"plaintext\">docker run -v \/var\/run\/docker.sock:\/var\/run\/docker.sock \n           -ti docker<\/code><\/pre>\n<p>\nKjo duket dhe funksionon si Docker-in-Docker, por nuk \u00ebsht\u00eb Docker-in-Docker: kur ky kontejner t\u00eb krijoj\u00eb kontejner\u00eb shtes\u00eb, ata do t\u00eb krijohen n\u00eb Dockerin e nivelit m\u00eb t\u00eb lart\u00eb. Nuk do t\u00eb p\u00ebrjetoni efekte an\u00ebsore t\u00eb thell\u00ebsis\u00eb, dhe cache i nd\u00ebrtimit do t\u00eb ndahet p\u00ebr thirrje t\u00eb shumta.<\/p>\n<p>Sh\u00ebnim: versionet e m\u00ebparshme t\u00eb k\u00ebtij artikulli k\u00ebshillonin q\u00eb t\u00eb lidhni skedarin binar t\u00eb Docker nga hosti n\u00eb kontejner. Tani kjo \u00ebsht\u00eb b\u00ebr\u00eb e pasigurt, pasi mekanizmi i Docker nuk zgjerohet m\u00eb n\u00eb biblioteka statike ose pothuajse statike.<\/p>\n<p>Pra, n\u00ebse d\u00ebshironi t\u00eb p\u00ebrdorni Docker nga Jenkins CI, keni 2 opsione:<br \/>\ninstalimi i Docker CLI duke p\u00ebrdorur sistemin baz\u00eb t\u00eb paketimit t\u00eb imazhit (dmth. n\u00ebse imazhi juaj bazohet n\u00eb Debian, p\u00ebrdorni paketat .deb), duke p\u00ebrdorur API Docker.<\/p>\n<h3>Pak reklam\u00eb \ud83d\ude42<\/h3>\n<p>\nFaleminderit q\u00eb po q\u00ebndroni me ne. Ju p\u00eblqen artikujt tan\u00eb? Doni t\u00eb shihni m\u00eb shum\u00eb materiale interesante? Na mb\u00ebshtesni duke b\u00ebr\u00eb nj\u00eb porosi ose duke rekomanduar tek miqt\u00eb tuaj, <noindex><a rel=\"nofollow\" href=\"https:\/\/ua-hosting.company\/cloudvps\/nl\">VPS cloud p\u00ebr zhvillues nga $4.99<\/a><\/noindex>, <b>nj\u00eb analog unik i server\u00ebve entry-level q\u00eb e kemi shpikur p\u00ebr Ju:<\/b> <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/company\/ua-hosting\/blog\/347386\/\">E gjith\u00eb e v\u00ebrteta n\u00eb lidhje me VPS (KVM) E5-2697 v3 (6 B\u00ebrthama) 10GB DDR4 480GB SSD 1Gbps nga $19 ose si ta ndajm\u00eb sakt\u00ebsisht serverin?<\/a><\/noindex> (opcionet me RAID1 dhe RAID10, deri n\u00eb 24 b\u00ebrthama dhe deri n\u00eb 40GB DDR4 jan\u00eb t\u00eb disponueshme).<\/p>\n<p><b>Dell R730xd dyfish m\u00eb i lir\u00eb n\u00eb qend\u00ebr t\u00eb t\u00eb dh\u00ebnave Equinix Tier IV n\u00eb Amsterdam?<\/b> Vet\u00ebm te ne <b><noindex><a rel=\"nofollow\" href=\"https:\/\/ua-hosting.company\/serversnl\">2 x Intel TetraDeca-Core Xeon 2x E5-2697v3 2.6GHz 14C 64GB DDR4 4x960GB SSD 1Gbps 100 TB nga $199<\/a><\/noindex> n\u00eb Holand\u00eb! <b>Dell R420 \u2014 2x E5-2430 2.2Ghz 6C 128GB DDR3 2x960GB SSD 1Gbps 100TB \u2014 nga $99!<\/b><\/b> Lexoni rreth <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/company\/ua-hosting\/blog\/329618\/\">Si t\u00eb nd\u00ebrtoni nj\u00eb infrastruktur\u00eb t\u00eb klas\u00ebs korporative me p\u00ebrdorimin e server\u00ebve Dell R730xd E5-2650 v4 me \u00e7mim 9000 euro p\u00ebr pak para?<\/a><\/noindex><br \/>\n<br \/>Burimi: <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/ua-hosting\/blog\/488536\/\">habr.com<\/a> <\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>Docker-in-Docker \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0441\u043e\u0431\u043e\u0439 \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u0443\u044e \u0441\u0440\u0435\u0434\u0443 Docker-\u0434\u0435\u043c\u043e\u043d, \u0437\u0430\u043f\u0443\u0449\u0435\u043d\u043d\u0443\u044e \u0432 \u0441\u0430\u043c\u043e\u043c \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0435 \u0434\u043b\u044f \u0441\u0431\u043e\u0440\u043a\u0438 \u043e\u0431\u0440\u0430\u0437\u043e\u0432 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430. \u041e\u0441\u043d\u043e\u0432\u043d\u043e\u0439 \u0446\u0435\u043b\u044c\u044e \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f Docker-in-Docker \u0431\u044b\u043b\u0430 \u043f\u043e\u043c\u043e\u0449\u044c \u0432 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0435 \u0441\u0430\u043c\u043e\u0433\u043e Docker. \u041c\u043d\u043e\u0433\u0438\u0435 \u043b\u044e\u0434\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442 \u0435\u0433\u043e \u0434\u043b\u044f \u0437\u0430\u043f\u0443\u0441\u043a\u0430 Jenkins CI. \u041f\u043e\u043d\u0430\u0447\u0430\u043b\u0443 \u044d\u0442\u043e \u043a\u0430\u0436\u0435\u0442\u0441\u044f \u043d\u043e\u0440\u043c\u0430\u043b\u044c\u043d\u044b\u043c, \u043d\u043e \u0437\u0430\u0442\u0435\u043c \u0432\u043e\u0437\u043d\u0438\u043a\u0430\u044e\u0442 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b, \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u043c\u043e\u0436\u043d\u043e \u0438\u0437\u0431\u0435\u0436\u0430\u0442\u044c, \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0432 Docker \u0432 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440 Jenkins CI. \u0412 \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f, \u043a\u0430\u043a \u044d\u0442\u043e [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":52072,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-52071","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 5.0.1.1 - aioseo.com -->\n\t<meta name=\"description\" content=\".\" \/>\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\/sq\/blog\/horosho-podumajte-prezhde-chem-ispolzovat-docker-in-docker-dlya-ci-ili-testovoj-sredy\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.1.1\" \/>\n\t\t<meta property=\"og:locale\" content=\"sq_AL\" \/>\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\u0425\u043e\u0440\u043e\u0448\u043e \u043f\u043e\u0434\u0443\u043c\u0430\u0439\u0442\u0435, \u043f\u0440\u0435\u0436\u0434\u0435 \u0447\u0435\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c Docker-in-Docker \u0434\u043b\u044f CI \u0438\u043b\u0438 \u0442\u0435\u0441\u0442\u043e\u0432\u043e\u0439 \u0441\u0440\u0435\u0434\u044b | ProHoster\" \/>\n\t\t<meta property=\"og:description\" content=\".\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/sq\/blog\/horosho-podumajte-prezhde-chem-ispolzovat-docker-in-docker-dlya-ci-ili-testovoj-sredy\" \/>\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-02-18T02:34:24+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2020-02-18T02:34:24+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\udd47Mendoni mir\u00eb para se t\u00eb p\u00ebrdorni Docker-in-Docker p\u00ebr CI ose mjedis testimi | ProHoster","description":".","canonical_url":"https:\/\/prohoster.info\/sq\/blog\/horosho-podumajte-prezhde-chem-ispolzovat-docker-in-docker-dlya-ci-ili-testovoj-sredy","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"sq_AL","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\u0425\u043e\u0440\u043e\u0448\u043e \u043f\u043e\u0434\u0443\u043c\u0430\u0439\u0442\u0435, \u043f\u0440\u0435\u0436\u0434\u0435 \u0447\u0435\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c Docker-in-Docker \u0434\u043b\u044f CI \u0438\u043b\u0438 \u0442\u0435\u0441\u0442\u043e\u0432\u043e\u0439 \u0441\u0440\u0435\u0434\u044b | ProHoster","og:description":".","og:url":"https:\/\/prohoster.info\/sq\/blog\/horosho-podumajte-prezhde-chem-ispolzovat-docker-in-docker-dlya-ci-ili-testovoj-sredy","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-02-18T02:34:24+00:00","article:modified_time":"2020-02-18T02:34:24+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"52071","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 20:50:23","updated":"2022-09-27 17:46:30","focus_keyword":null,"additional_keywords":null,"truseo_locale":null},"gt_translate_keys":[{"key":"link","format":"url"}],"_links":{"self":[{"href":"https:\/\/prohoster.info\/sq\/wp-json\/wp\/v2\/posts\/52071","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/sq\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/sq\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/sq\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/sq\/wp-json\/wp\/v2\/comments?post=52071"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/sq\/wp-json\/wp\/v2\/posts\/52071\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/sq\/wp-json\/wp\/v2\/media\/52072"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/sq\/wp-json\/wp\/v2\/media?parent=52071"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/sq\/wp-json\/wp\/v2\/categories?post=52071"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/sq\/wp-json\/wp\/v2\/tags?post=52071"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}