{"id":81600,"date":"2020-05-15T01:42:41","date_gmt":"2020-05-14T23:42:41","guid":{"rendered":"https:\/\/prohoster.info\/blog\/administrirovanie\/neskolko-sovetov-o-tom-kak-uskorit-sborku-docker-obrazov-naprimer-do-30-sekund"},"modified":"2020-05-15T01:42:41","modified_gmt":"2020-05-14T23:42:41","slug":"neskolko-sovetov-o-tom-kak-uskorit-sborku-docker-obrazov-naprimer-do-30-sekund","status":"publish","type":"post","link":"https:\/\/prohoster.info\/sq\/blog\/administrirovanie\/neskolko-sovetov-o-tom-kak-uskorit-sborku-docker-obrazov-naprimer-do-30-sekund","title":{"rendered":"Disa k\u00ebshilla p\u00ebr t\u00eb p\u00ebrshpejtuar nd\u00ebrtimin e imazheve Docker. P\u00ebr shembull, deri n\u00eb 30 sekonda","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>Para se nj\u00eb funksionalitet t\u00eb arrij\u00eb n\u00eb prodhim, n\u00eb k\u00ebt\u00eb koh\u00eb orkestra t\u00eb komplikuara dhe CI\/CD na duhet t\u00eb kalojm\u00eb nj\u00eb rrug\u00eb t\u00eb gjat\u00eb nga komitimi n\u00eb teste dhe d\u00ebrgesa. Disa vite m\u00eb par\u00eb, mund t\u00eb ngarkohej skedar\u00ebt e rinj p\u00ebrmes FTP (askush nuk e b\u00ebn m\u00eb k\u00ebt\u00eb, apo jo?), dhe procesi i \"deploi\" zgjaste sekonda. Tani, megjithat\u00eb, duhet t\u00eb krijojm\u00eb nj\u00eb k\u00ebrkes\u00eb bashkimi dhe t\u00eb presim nj\u00eb koh\u00eb t\u00eb konsiderueshme derisa funksionaliteti t\u00eb arrij\u00eb te p\u00ebrdoruesit.<\/p>\n<p><\/p>\n<p>Nj\u00eb pjes\u00eb e k\u00ebsaj rrug\u00ebtimi \u00ebsht\u00eb nd\u00ebrtimi i imazhit Docker. Nd sometimes nd\u00ebrtimi zgjat minuta, ng sometimes rreth dhjet\u00ebra minuta, q\u00eb \u00ebsht\u00eb e v\u00ebshtir\u00eb t\u00eb quhet normale. N\u00eb k\u00ebt\u00eb artikull do t\u00eb marrim nj\u00eb aplikacion t\u00eb thjesht\u00eb, t\u00eb cilin do ta paketojm\u00eb n\u00eb nj\u00eb imazh, do t\u00eb aplikojm\u00eb disa metoda p\u00ebr t\u00eb p\u00ebrshpejtuar nd\u00ebrtimin dhe do t\u00eb shqyrtojm\u00eb nuancat e funksionimit t\u00eb k\u00ebtyre metodave.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Disa k\u00ebshilla p\u00ebr t\u00eb p\u00ebrshpejtuar nd\u00ebrtimin e imazheve Docker. P\u00ebr shembull, deri n\u00eb 30 sekonda\" src=\"\/wp-content\/uploads\/2020\/05\/7d4775ca1ac64735dfcaba205416da50.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<p>Ne kemi nj\u00eb p\u00ebrvoj\u00eb t\u00eb mir\u00eb n\u00eb krijimin dhe mb\u00ebshtetjen e faqeve t\u00eb mediave: <noindex><a rel=\"nofollow\" href=\"https:\/\/tass.ru\/\">TASS<\/a><\/noindex>, <noindex><a rel=\"nofollow\" href=\"https:\/\/thebell.io\/\">The Bell<\/a><\/noindex>, <noindex><a rel=\"nofollow\" href=\"https:\/\/novayagazeta.ru\/\">\"Gazeta e Re\"<\/a><\/noindex>, <noindex><a rel=\"nofollow\" href=\"https:\/\/republic.ru\/\">Republic<\/a><\/noindex>\u2026 Jo shum\u00eb koh\u00eb m\u00eb par\u00eb, ne e kemi pasuruar portofolin ton\u00eb duke lansuar nj\u00eb site n\u00eb prodhim <noindex><a rel=\"nofollow\" href=\"https:\/\/reminder.media\">Reminder<\/a><\/noindex>. Nd\u00ebrsa po plot\u00ebsonim funksionalitetet e reja dhe po riparonim defektet e vjetra, d\u00ebrgimi i ngadalsh\u00ebm u b\u00eb nj\u00eb problem i madh.<\/p>\n<p><\/p>\n<p>D\u00ebrgimin e realizojm\u00eb n\u00eb GitLab. Nd\u00ebrtojm\u00eb imazhe, i d\u00ebrgojm\u00eb n\u00eb GitLab Registry dhe i zbatojm\u00eb n\u00eb prodhim. N\u00eb k\u00ebt\u00eb list\u00eb, m\u00eb e gjat\u00eb \u00ebsht\u00eb nd\u00ebrtimi i imazheve. P\u00ebr shembull: pa optimizim, \u00e7do nd\u00ebrtim i backend-it zgjaste 14 minuta.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Disa k\u00ebshilla p\u00ebr t\u00eb p\u00ebrshpejtuar nd\u00ebrtimin e imazheve Docker. P\u00ebr shembull, deri n\u00eb 30 sekonda\" src=\"\/wp-content\/uploads\/2020\/05\/043bc8ad67c34e1c7bd705433c5e4e77.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>M\u00eb n\u00eb fund u b\u00eb e qart\u00eb se k\u00ebshtu nuk mund t\u00eb jetojm\u00eb m\u00eb, dhe u ul\u00ebm t\u00eb kuptojm\u00eb pse imazhet po ndiqnin kaq shum\u00eb koh\u00eb. N\u00eb fund arrit\u00ebm ta zvog\u00eblojm\u00eb koh\u00ebn e nd\u00ebrtimit n\u00eb 30 sekonda!<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Disa k\u00ebshilla p\u00ebr t\u00eb p\u00ebrshpejtuar nd\u00ebrtimin e imazheve Docker. P\u00ebr shembull, deri n\u00eb 30 sekonda\" src=\"\/wp-content\/uploads\/2020\/05\/d035eb1c7b95e0345a110ee59f472693.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>P\u00ebr k\u00ebt\u00eb artikull, p\u00ebr t\u00eb mos u lidhur me ambientin Reminder, le t\u00eb shqyrtojm\u00eb nj\u00eb shembull t\u00eb nd\u00ebrtimit t\u00eb nj\u00eb aplikacioni t\u00eb zbraz\u00ebt n\u00eb Angular. K\u00ebshtu, le t\u00eb krijojm\u00eb aplikacionin ton\u00eb:<\/p>\n<p><\/p>\n<pre><code class=\"bash\">ng n app<\/code><\/pre>\n<p><\/p>\n<p>Shtojm\u00eb PWA (ne jemi progresiv\u00eb):<\/p>\n<p><\/p>\n<pre><code class=\"bash\">ng add @angular\/pwa --project app<\/code><\/pre>\n<p><\/p>\n<p>Nd\u00ebrsa po shkarkohet miliona npm-pakete, le t\u00eb shqyrtojm\u00eb se si \u00ebsht\u00eb struktura e imazhit Docker. Docker ofron mund\u00ebsin\u00eb p\u00ebr t\u00eb paketuar aplikacionet dhe p\u00ebr t'i ekzekutuar ato n\u00eb nj\u00eb mjedis t\u00eb izoluar, i cili quhet kontejner. Fal\u00eb izolimit, \u00ebsht\u00eb e mundur t\u00eb ekzekutoni shum\u00eb kontejner\u00eb nj\u00ebkoh\u00ebsisht n\u00eb nj\u00eb server. Kontejner\u00ebt jan\u00eb ndjesh\u00ebm m\u00eb t\u00eb leht\u00eb se makinat virtuale, pasi ekzekutohen direkt mbi b\u00ebrtham\u00ebn e sistemit. P\u00ebr t\u00eb ekzekutuar nj\u00eb kontejner me aplikacionin ton\u00eb, na nevojitet fillimisht t\u00eb krijojm\u00eb nj\u00eb imazh, n\u00eb t\u00eb cilin do t\u00eb paketojm\u00eb gjith\u00e7ka q\u00eb nevojitet p\u00ebr funksionimin e aplikacionit ton\u00eb. N\u00eb thelb, imazhi \u00ebsht\u00eb nj\u00eb kopje e sistemit t\u00eb skedar\u00ebve. P\u00ebr shembull, le t\u00eb marrim Dockerfile:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">FROM node:12.16.2\nWORKDIR \/app\nCOPY . .\nRUN npm ci\nRUN npm run build --prod<\/code><\/pre>\n<p><\/p>\n<p>Dockerfile \u00ebsht\u00eb nj\u00eb grup udh\u00ebzimesh; duke e ekzekutuar secil\u00ebn prej tyre, Docker do t\u00eb ruaj\u00eb ndryshimet n\u00eb sistemin e skedar\u00ebve dhe do t'i mbivendos\u00eb ato mbi ato t\u00eb m\u00ebparshme. \u00c7do komand\u00eb krijon layer-in e vet. Dhe imazhi p\u00ebrfundimtar \u00ebsht\u00eb nj\u00eb kombinim i k\u00ebtyre layer-eve.<\/p>\n<p><\/p>\n<p>\u00c7far\u00eb \u00ebsht\u00eb e r\u00ebnd\u00ebsishme t\u00eb dini: \u00e7do layer Docker ka aft\u00ebsin\u00eb t\u00eb mbaj\u00eb n\u00eb memory. N\u00ebse nuk ka ndryshime nga ndihma e kaluar, Docker do t\u00eb marr\u00eb layer-in e gatsh\u00ebm n\u00eb vend t\u00eb ekzekutimit t\u00eb komand\u00ebs. Duke qen\u00eb se p\u00ebrfitimi kryesor n\u00eb shpejt\u00ebsin\u00eb e nd\u00ebrtimit do t\u00eb vij\u00eb nga p\u00ebrdorimi i cache-it, n\u00eb matjet e shpejt\u00ebsis\u00eb do t\u00eb p\u00ebrqendrohemi pik\u00ebrisht n\u00eb nd\u00ebrtimin e imazhit me cache t\u00eb gatsh\u00ebm. Pra, hapat jan\u00eb:<\/p>\n<p><\/p>\n<ol>\n<li>Fshijm\u00eb imazhet lokalmente, n\u00eb m\u00ebnyr\u00eb q\u00eb lan\u00e7imet e m\u00ebparshme t\u00eb mos ndikojn\u00eb n\u00eb test.<br \/>\n<code>docker rmi $(docker images -q)<\/code><\/li>\n<li>Nisemi me nd\u00ebrtimin p\u00ebr her\u00eb t\u00eb par\u00eb.<br \/>\n<code>time docker build -t app .<\/code><\/li>\n<li>Ndryshojm\u00eb skedarin src\/index.html - imitojm\u00eb pun\u00ebn e programuesit.<\/li>\n<li>Nisemi me nd\u00ebrtimin p\u00ebr her\u00eb t\u00eb dyt\u00eb.<br \/>\n<code>time docker build -t app .<\/code><\/li>\n<\/ol>\n<p><\/p>\n<p>N\u00ebse mjedisi p\u00ebr nd\u00ebrtimin e imazheve \u00ebsht\u00eb konfiguruar si\u00e7 duhet (p\u00ebr t\u00eb cilin do t\u00eb flasim pak m\u00eb posht\u00eb), at\u00ebher\u00eb Docker do t\u00eb ket\u00eb nj\u00eb s\u00ebr\u00eb cache-esh n\u00eb bord gjat\u00eb nisjes s\u00eb nd\u00ebrtimit. Detyra jon\u00eb \u00ebsht\u00eb t\u00eb m\u00ebsojm\u00eb si t\u00eb p\u00ebrdorim cache-in n\u00eb m\u00ebnyr\u00eb q\u00eb nd\u00ebrtimi t\u00eb kaloj\u00eb sa m\u00eb shpejt. Duke supozuar se nisja e nd\u00ebrtimit pa cache ndodh vet\u00ebm nj\u00eb her\u00eb \u2014 e para \u2014 mund ta injorojm\u00eb ngadal\u00ebsin\u00eb e atij fillimi. N\u00eb testet tona na intereson nisja e dyt\u00eb e nd\u00ebrtimit, kur cache-\u00ebt tashm\u00eb jan\u00eb ngrohur dhe jemi gati t\u00eb pjekim tort\u00ebn ton\u00eb. Megjithat\u00eb, disa k\u00ebshilla do t\u00eb ndikojn\u00eb edhe n\u00eb nd\u00ebrtimin e par\u00eb.<\/p>\n<p><\/p>\n<p>Le t\u00eb vendosim Dockerfile, t\u00eb p\u00ebrshkruar m\u00eb sip\u00ebr, n\u00eb folderin e projektit dhe t\u00eb fillojm\u00eb nd\u00ebrtimin. T\u00eb gjitha listat e p\u00ebrmendura jan\u00eb reduktuar p\u00ebr leht\u00ebsin\u00eb e leximit.<\/p>\n<p><\/p>\n<pre><code class=\"bash\">$ time docker build -t app .\nDuke d\u00ebrguar kontekstin e nd\u00ebrtimit te daemon-i Docker 409MB\nHapi 1\/5: FROM node:12.16.2\nStatusi: Imazhi m\u00eb i ri i descarguar p\u00ebr node:12.16.2\nHapi 2\/5: WORKDIR \/app\nHapi 3\/5: COPY . .\nHapi 4\/5: RUN npm ci\nshtuar 1357 pacakgje n\u00eb 22.47s\nHapi 5\/5: RUN npm run build --prod\nData: 2020-04-16T19:20:09.664Z - Hash: fffa0fddaa3425c55dd3 - Koha: 37581ms\nSuksessh\u00ebm u nd\u00ebrtua c8c279335f46\nSuksessh\u00ebm i etiketuar app:latest\n\nreal 5m4.541s\nuser 0m0.000s\nsys 0m0.000s<\/code><\/pre>\n<p><\/p>\n<p>Ndryshojm\u00eb p\u00ebrmbajtjen e src\/index.html dhe fillojm\u00eb p\u00ebr her\u00eb t\u00eb dyt\u00eb.<\/p>\n<p><\/p>\n<pre><code class=\"bash\">$ time docker build -t app .\nDuke d\u00ebrguar kontekstin e nd\u00ebrtimit te daemon-i Docker 409MB\nHapi 1\/5: FROM node:12.16.2\nHapi 2\/5: WORKDIR \/app\n ---&gt; Duke p\u00ebrdorur cache\nHapi 3\/5: COPY . .\nHapi 4\/5: RUN npm ci\nshtuar 1357 pacakgje n\u00eb 22.47s\nHapi 5\/5: RUN npm run build --prod\nData: 2020-04-16T19:26:26.587Z - Hash: fffa0fddaa3425c55dd3 - Koha: 37902ms\nSuksessh\u00ebm u nd\u00ebrtua 79f335df92d3\nSuksessh\u00ebm i etiketuar app:latest\n\nreal 3m33.262s\nuser 0m0.000s\nsys 0m0.000s<\/code><\/pre>\n<p><\/p>\n<p>P\u00ebr t\u00eb par\u00eb n\u00ebse kemi arritur t\u00eb krijojm\u00eb imazhin, ekzekutojm\u00eb komand\u00ebn <code>docker images<\/code>:<\/p>\n<p><\/p>\n<pre><code class=\"bash\">REPOSITORY   TAG      IMAGE ID       CREATED              SIZE\napp          latest   79f335df92d3   Pothuajse nj\u00eb minut\u00eb m\u00eb par\u00eb   1.74GB<\/code><\/pre>\n<p><\/p>\n<p>Para nd\u00ebrtimin, Docker merr t\u00eb gjitha skedar\u00ebt n\u00eb kontekstin aktual dhe i d\u00ebrgon atyre demot e tij <code>D\u00ebrgimi i kontekstit t\u00eb nd\u00ebrtimit n\u00eb demon Docker 409MB<\/code>. Konteksti p\u00ebr nd\u00ebrtimin p\u00ebrcaktohet si argumenti i fundit i komand\u00ebs build. N\u00eb rastin ton\u00eb, kjo \u00ebsht\u00eb direktoria aktuale \u2014 \" . \", dhe Docker merr gjith\u00e7ka q\u00eb kemi n\u00eb k\u00ebt\u00eb dosje. 409 MByte \u00ebsht\u00eb shumic\u00eb: le t\u00eb mendojm\u00eb si ta rregullojm\u00eb k\u00ebt\u00eb.<\/p>\n<p><\/p>\n<h2 id=\"umenshaem-kontekst\">Duke zvog\u00ebluar kontekstin<\/h2>\n<p><\/p>\n<p>P\u00ebr t\u00eb reduktuar kontekstin, ka dy mund\u00ebsi. Ose vendosni t\u00eb gjith\u00eb skedar\u00ebt e nevojsh\u00ebm p\u00ebr nd\u00ebrtim n\u00eb nj\u00eb dosje t\u00eb ve\u00e7ant\u00eb dhe i referoheni kontekstit Dockerit pik\u00ebrisht n\u00eb k\u00ebt\u00eb dosje. Kjo nuk \u00ebsht\u00eb gjithmon\u00eb e p\u00ebrshtatshme, prandaj ka mund\u00ebsin\u00eb t\u00eb specifikoni p\u00ebrjashtime: \u00e7far\u00eb nuk duhet t\u00eb t\u00ebrhiqet n\u00eb kontekst. P\u00ebr k\u00ebt\u00eb do t\u00eb vendosim n\u00eb projekt skedarin .dockerignore dhe do t\u00eb p\u00ebrcaktojm\u00eb se \u00e7far\u00eb nuk nevojitet p\u00ebr nd\u00ebrtim:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">.git\n\/node_modules<\/code><\/pre>\n<p><\/p>\n<p>dhe do t\u00eb fillojm\u00eb p\u00ebrs\u00ebri nd\u00ebrtimin:<\/p>\n<p><\/p>\n<pre><code class=\"bash\">$ time docker build -t app .\nD\u00ebrgimi i kontekstit t\u00eb nd\u00ebrtimit n\u00eb demon Docker 607.2kB\nHapi 1\/5 : FROM node:12.16.2\nHapi 2\/5 : WORKDIR \/app\n ---&gt; Duke p\u00ebrdorur cache\nHapi 3\/5 : COPY . .\nHapi 4\/5 : RUN npm ci\nu shtuan 1357 paketat n\u00eb 22.47s\nHapi 5\/5 : RUN npm run build --prod\nData: 2020-04-16T19:33:54.338Z - Hash: fffa0fddaa3425c55dd3 - Koha: 37313ms\nSuksesivisht nd\u00ebrtuar 4942f010792a\nSuksesivisht i etiketuar app:latest\n\nreal 1m47.763s\nuser 0m0.000s\nsys 0m0.000s<\/code><\/pre>\n<p><\/p>\n<p>607.2 Kbyte \u00ebsht\u00eb shum\u00eb m\u00eb mir\u00eb se 409 MByte. E megjithat\u00eb, kemi zvog\u00ebluar madh\u00ebsin\u00eb e imazhit nga 1.74 n\u00eb 1.38GB:<\/p>\n<p><\/p>\n<pre><code class=\"bash\">REPOSITORY   TAG      IMAGE ID       CREATED         SIZE\napp          latest   4942f010792a   3 minuta m\u00eb par\u00eb   1.38GB<\/code><\/pre>\n<p><\/p>\n<p>Le t\u00eb provosh s\u00ebrish ta zvog\u00eblojm\u00eb madh\u00ebsin\u00eb e imazhit.<\/p>\n<p><\/p>\n<h2 id=\"ispolzuem-alpine\">P\u00ebrdorim Alpine<\/h2>\n<p><\/p>\n<p>Nj\u00eb tjet\u00ebr m\u00ebnyr\u00eb p\u00ebr t\u00eb kursyer n\u00eb madh\u00ebsin\u00eb e imazhit \u00ebsht\u00eb t\u00eb p\u00ebrdorni nj\u00eb imazh prind t\u00eb vog\u00ebl. Imazhi prind \u00ebsht\u00eb imazhi mbi t\u00eb cilin krijohet imazhi yn\u00eb. Shtresa e poshtme p\u00ebrcaktohet me komand\u00ebn <code>FROM<\/code> n\u00eb Dockerfile. N\u00eb rastin ton\u00eb, ne p\u00ebrdorim nj\u00eb imazh t\u00eb bazuar n\u00eb Ubuntu, i cili tashm\u00eb ka nodejs t\u00eb instaluar. Dhe pesha \u00ebsht\u00eb ...<\/p>\n<p><\/p>\n<pre><code class=\"bash\">$ docker images -a | grep node\nnode 12.16.2 406aa3abbc6c 17 minuta m\u00eb par\u00eb 916MB<\/code><\/pre>\n<p><\/p>\n<p>... pothuajse nj\u00eb gigabyte. Mund t\u00eb reduktojm\u00eb duksh\u00ebm volumet duke p\u00ebrdorur nj\u00eb imazh t\u00eb bazuar n\u00eb Alpine Linux. Alpine \u00ebsht\u00eb nj\u00eb Linux shum\u00eb i vog\u00ebl. Imazhi Docker p\u00ebr nodejs t\u00eb bazuar n\u00eb alpine peshon vet\u00ebm 88.5 MByte. Prandaj, le t\u00eb z\u00ebvend\u00ebsojm\u00eb imazhin ton\u00eb t\u00eb trash\u00eb:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">FROM node:12.16.2-alpine3.11\nRUN apk --no-cache --update --virtual build-dependencies add \n    python \n    make \n    g++\nWORKDIR \/app\nCOPY . .\nRUN npm ci\nRUN npm run build --prod<\/code><\/pre>\n<p><\/p>\n<p>Na u desh t\u00eb instalojm\u00eb disa gj\u00ebra q\u00eb jan\u00eb t\u00eb nevojshme p\u00ebr nd\u00ebrtimin e aplikacionit. Po, Angular nuk nd\u00ebrttohet pa Python \u00af(\u00b0_o)\\\/\u00af<\/p>\n<p><\/p>\n<p>Por megjithat\u00eb, madh\u00ebsia e imazhit u zvog\u00eblua me 150 MByte:<\/p>\n<p><\/p>\n<pre><code class=\"bash\">REPOSITORY   TAG      IMAGE ID       CREATED          SIZE\napp          latest   aa031edc315a   22 minuta m\u00eb par\u00eb   761MB<\/code><\/pre>\n<p><\/p>\n<p>T\u00eb vazhdojm\u00eb m\u00eb tej.<\/p>\n<p><\/p>\n<h2 id=\"multisteydzh-sborka\">Nd\u00ebrtimi me shum\u00eb skena<\/h2>\n<p><\/p>\n<p>Nuk \u00ebsht\u00eb gjith\u00e7ka q\u00eb \u00ebsht\u00eb n\u00eb imazh, q\u00eb na nevojitet n\u00eb produksion.<\/p>\n<p><\/p>\n<pre><code class=\"bash\">$ docker run app ls -lah\ntotal 576K\ndrwxr-xr-x 1 root root 4.0K Apr 16 19:54 .\ndrwxr-xr-x 1 root root 4.0K Apr 16 20:00 ..\n-rwxr-xr-x 1 root root 19 Apr 17 2020 .dockerignore\n-rwxr-xr-x 1 root root 246 Apr 17 2020 .editorconfig\n-rwxr-xr-x 1 root root 631 Apr 17 2020 .gitignore\n-rwxr-xr-x 1 root root 181 Apr 17 2020 Dockerfile\n-rwxr-xr-x 1 root root 1020 Apr 17 2020 README.md\n-rwxr-xr-x 1 root root 3.6K Apr 17 2020 angular.json\n-rwxr-xr-x 1 root root 429 Apr 17 2020 browserslist\ndrwxr-xr-x 3 root root 4.0K Apr 16 19:54 dist\ndrwxr-xr-x 3 root root 4.0K Apr 17 2020 e2e\n-rwxr-xr-x 1 root root 1015 Apr 17 2020 karma.conf.js\n-rwxr-xr-x 1 root root 620 Apr 17 2020 ngsw-config.json\ndrwxr-xr-x 1 root root 4.0K Apr 16 19:54 node_modules\n-rwxr-xr-x 1 root root 494.9K Apr 17 2020 package-lock.json\n-rwxr-xr-x 1 root root 1.3K Apr 17 2020 package.json\ndrwxr-xr-x 5 root root 4.0K Apr 17 2020 src\n-rwxr-xr-x 1 root root 210 Apr 17 2020 tsconfig.app.json\n-rwxr-xr-x 1 root root 489 Apr 17 2020 tsconfig.json\n-rwxr-xr-x 1 root root 270 Apr 17 2020 tsconfig.spec.json\n-rwxr-xr-x 1 root root 1.9K Apr 17 2020 tslint.json<\/code><\/pre>\n<p><\/p>\n<p>Me ndihm\u00ebn e <code>docker run app ls -lah<\/code> ne kemi lansuar nj\u00eb kontenier t\u00eb bazuar n\u00eb imazhin ton\u00eb <code>app<\/code> dhe kemi ekzekutuar komand\u00ebn n\u00eb t\u00eb <code>ls -lah<\/code>, pas s\u00eb cil\u00ebs kontenieri p\u00ebrfundoi pun\u00ebn e tij.<\/p>\n<p><\/p>\n<p>N\u00eb prodhim na nevojitet vet\u00ebm folderi <code>dist<\/code>. N\u00eb t\u00eb nj\u00ebjt\u00ebn koh\u00eb, duhet t\u00eb dor\u00ebzojm\u00eb ndonj\u00ebfar\u00eb skedari jasht\u00eb. Mund t\u00eb nisnim ndonj\u00eb server HTTP n\u00eb nodejs. Por ne do ta thjeshtojm\u00eb. Provoni t\u00eb gjesh fjal\u00ebn ruse, q\u00eb ka kat\u00ebr shkronja '\u044b'. E sakt\u00eb! \u042b\u043d\u0436\u044b\u043d\u044b\u043a\u0441\u044b. Do t\u00eb marrim imazhin me nginx, do ta vendosim n\u00eb t\u00eb folderin <code>dist<\/code> dhe nj\u00eb konfigurim t\u00eb vog\u00ebl:<\/p>\n<p><\/p>\n<pre><code class=\"nginx\">server {\n    listen 80 default_server;\n    server_name localhost;\n    charset utf-8;\n    root \/app\/dist;\n\n    location \/ {\n        try_files $uri $uri\/ \/index.html;\n    }\n}<\/code><\/pre>\n<p><\/p>\n<p>Kjo do t\u00eb na ndihmoj\u00eb t\u00eb realizojm\u00eb ndihm\u00ebn e proceseve multi-stage. Do t\u00eb ndryshojm\u00eb Dockerfile-in ton\u00eb:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">FROM node:12.16.2-alpine3.11 as builder\nRUN apk --no-cache --update --virtual build-dependencies add \n    python \n    make \n    g++\nWORKDIR \/app\nCOPY . .\nRUN npm ci\nRUN npm run build --prod\n\nFROM nginx:1.17.10-alpine\nRUN rm \/etc\/nginx\/conf.d\/default.conf\nCOPY nginx\/static.conf \/etc\/nginx\/conf.d\nCOPY --from=builder \/app\/dist\/app .<\/code><\/pre>\n<p><\/p>\n<p>Tani kemi dy instrukte <code>FROM<\/code> n\u00eb Dockerfile, secila prej tyre nis faz\u00ebn e saj t\u00eb nd\u00ebrtimit. E para e quajt\u00ebm <code>nd\u00ebrtuesit, q\u00eb ne do t\u00eb caktojm\u00eb pak m\u00eb von\u00eb. Emri n\u00eb rastin ton\u00eb do t\u00eb jet\u00eb e nj\u00ebjt\u00eb me emrin e projektit:<\/code>, nd\u00ebrsa duke filluar nga FROM i fundit do t\u00eb p\u00ebrgatitet imazhi yn\u00eb p\u00ebrfundimtar. Hapi i fundit \u00ebsht\u00eb t\u00eb kopjojm\u00eb artefaktin e nd\u00ebrtimit nga faza e m\u00ebparshme n\u00eb imazhin p\u00ebrfundimtar me nginx. Madh\u00ebsia e imazhit \u00ebsht\u00eb zvog\u00ebluar ndjesh\u00ebm:<\/p>\n<p><\/p>\n<pre><code class=\"bash\">REPOSITORY   TAG      IMAGE ID       CREATED          SIZE\napp          latest   2c6c5da07802   29 minutes ago   36MB<\/code><\/pre>\n<p><\/p>\n<p>Le t\u00eb nisnim nj\u00eb kontenier me imazhin ton\u00eb dhe t\u00eb sigurohemi q\u00eb gjith\u00e7ka funksionon:<\/p>\n<p><\/p>\n<pre><code class=\"bash\">docker run -p8080:80 app<\/code><\/pre>\n<p><\/p>\n<p>Me opsionin -p8080:80 kemi kaluar portin 8080 n\u00eb makin\u00ebn ton\u00eb host n\u00eb portin 80 brenda kontenierit, ku po funksionon nginx. Hap n\u00eb shfletues <noindex><a rel=\"nofollow\" href=\"http:\/\/localhost:8080\/\">http:\/\/localhost:8080\/<\/a><\/noindex> dhe shohim aplikacionin ton\u00eb. Po funksionon!<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Disa k\u00ebshilla p\u00ebr t\u00eb p\u00ebrshpejtuar nd\u00ebrtimin e imazheve Docker. P\u00ebr shembull, deri n\u00eb 30 sekonda\" src=\"\/wp-content\/uploads\/2020\/05\/ab37d9576a84954f4e4860dd49a75f3d.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Zvog\u00eblimi i madh\u00ebsis\u00eb s\u00eb imazhit nga 1.74 GB n\u00eb 36 MB zvog\u00eblon ndjesh\u00ebm koh\u00ebn e dor\u00ebzimit t\u00eb aplikacionit tuaj n\u00eb prodhim. Por le t\u00eb kthehemi te koha e nd\u00ebrtimit.<\/p>\n<p><\/p>\n<pre><code class=\"bash\">$ time docker build -t app .\nSending build context to Docker daemon 608.8kB\nStep 1\/11 : FROM node:12.16.2-alpine3.11 as builder\nStep 2\/11 : RUN apk --no-cache --update --virtual build-dependencies add python make g++\n ---&gt; Using cache\nStep 3\/11 : WORKDIR \/app\n ---&gt; Using cache\nStep 4\/11 : COPY . .\nStep 5\/11 : RUN npm ci\nadded 1357 packages in 47.338s\nStep 6\/11 : RUN npm run build --prod\nDate: 2020-04-16T21:16:03.899Z - Hash: fffa0fddaa3425c55dd3 - Time: 39948ms\n ---&gt; 27f1479221e4\nStep 7\/11 : FROM nginx:stable-alpine\nStep 8\/11 : WORKDIR \/app\n ---&gt; Using cache\nStep 9\/11 : RUN rm \/etc\/nginx\/conf.d\/default.conf\n ---&gt; Using cache\nStep 10\/11 : COPY nginx\/static.conf \/etc\/nginx\/conf.d\n ---&gt; Using cache\nStep 11\/11 : COPY --from=builder \/app\/dist\/app .\nSuccessfully built d201471c91ad\nSuccessfully tagged app:latest\n\nreal 2m17.700s\nuser 0m0.000s\nsys 0m0.000s<\/code><\/pre>\n<p><\/p>\n<h2 id=\"menyaem-poryadok-sloyov\">Ndryshojm\u00eb rendin e shtresave<\/h2>\n<p><\/p>\n<p>T\u00eb tre hapat e par\u00eb ishin t\u00eb ruajtur me cache (k\u00ebshill\u00eb <code>Using cache<\/code>). N\u00eb hapin e kat\u00ebrt kopjohen t\u00eb gjitha skedar\u00ebt e projektit dhe n\u00eb hapin e pest\u00eb vendosen var\u00ebsit\u00eb <code>RUN npm ci<\/code> \u2014 plot 47.338s. Why re-install dependencies every time when they change very rarely? Let\u2019s figure out why they weren't cached. The fact is that Docker checks layer by layer to see if the command and associated files have changed. At the fourth step, we copy all the files of our project, and among them, of course, there are changes, so Docker not only does not take this layer from the cache, but also all subsequent ones! Let\u2019s make some small changes in the Dockerfile.<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">FROM node:12.16.2-alpine3.11 as builder\nRUN apk --no-cache --update --virtual build-dependencies add \n    python \n    make \n    g++\nWORKDIR \/app\nCOPY package*.json .\/\nRUN npm ci\nCOPY . .\nRUN npm run build --prod\n\nFROM nginx:1.17.10-alpine\nRUN rm \/etc\/nginx\/conf.d\/default.conf\nCOPY nginx\/static.conf \/etc\/nginx\/conf.d\nCOPY --from=builder \/app\/dist\/app .<\/code><\/pre>\n<p><\/p>\n<p>First, package.json and package-lock.json are copied, then dependencies are installed, and only after that the entire project is copied. As a result:<\/p>\n<p><\/p>\n<pre><code class=\"bash\">$ time docker build -t app .\nSending build context to Docker daemon 608.8kB\nStep 1\/12 : FROM node:12.16.2-alpine3.11 as builder\nStep 2\/12 : RUN apk --no-cache --update --virtual build-dependencies add python make g++\n ---&gt; Using cache\nStep 3\/12 : WORKDIR \/app\n ---&gt; Using cache\nStep 4\/12 : COPY package*.json .\/\n ---&gt; Using cache\nStep 5\/12 : RUN npm ci\n ---&gt; Using cache\nStep 6\/12 : COPY . .\nStep 7\/12 : RUN npm run build --prod\nDate: 2020-04-16T21:29:44.770Z - Hash: fffa0fddaa3425c55dd3 - Time: 38287ms\n ---&gt; 1b9448c73558\nStep 8\/12 : FROM nginx:stable-alpine\nStep 9\/12 : WORKDIR \/app\n ---&gt; Using cache\nStep 10\/12 : RUN rm \/etc\/nginx\/conf.d\/default.conf\n ---&gt; Using cache\nStep 11\/12 : COPY nginx\/static.conf \/etc\/nginx\/conf.d\n ---&gt; Using cache\nStep 12\/12 : COPY --from=builder \/app\/dist\/app .\nSuccessfully built a44dd7c217c3\nSuccessfully tagged app:latest\n\nreal 0m46.497s\nuser 0m0.000s\nsys 0m0.000s<\/code><\/pre>\n<p><\/p>\n<p>46 seconds instead of 3 minutes \u2014 much better! The correct order of layers is important: first we copy what doesn't change, then what changes rarely, and finally \u2014 what changes often.<\/p>\n<p><\/p>\n<p>Next, a few words about building images in CI\/CD systems.<\/p>\n<p><\/p>\n<h2 id=\"ispolzovanie-predyduschih-obrazov-dlya-kesha\">Using previous images for cache<\/h2>\n<p><\/p>\n<p>If we are using some SaaS solution for building, then the local Docker cache may turn out to be clean and fresh. To give Docker a source for baked layers, provide it with a previously built image.<\/p>\n<p><\/p>\n<p>Let\u2019s take the example of building our application in GitHub Actions. We will use such a config<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">n\u00eb:\n  shtyp:\n    deget:\n      - master\n\nemri: Test docker build\n\npun\u00ebt:\n  shp\u00ebrndaj:\n    emri: Build\n    funksionon n\u00eb: ubuntu-latest\n    mjedisi:\n      IMAGE_NAME: docker.pkg.github.com\/${{ github.repository }}\/app\n      IMAGE_TAG: ${{ github.sha }}\n\n    hapat:\n    - emri: Kontrollo\n      p\u00ebrdor: actions\/checkout@v2\n\n    - emri: Hyra n\u00eb GitHub Packages\n      mjedisi:\n        TOK\u00cbN: ${{ secrets.GITHUB_TOKEN }}\n      ekzekuto: |\n        docker login docker.pkg.github.com -u $GITHUB_ACTOR -p $TOK\u00cbN\n\n    - emri: Nd\u00ebrto\n      ekzekuto: |\n        docker build \n          -t $IMAGE_NAME:$IMAGE_TAG \n          -t $IMAGE_NAME:latest \n          .\n\n    - emri: D\u00ebrgo imazhin n\u00eb GitHub Packages\n      ekzekuto: |\n        docker push $IMAGE_NAME:latest\n        docker push $IMAGE_NAME:$IMAGE_TAG\n\n    - emri: Dalje\n      ekzekuto: |\n        docker logout docker.pkg.github.com<\/code><\/pre>\n<p><\/p>\n<p>Imazhi nd\u00ebrtohet dhe d\u00ebrgohet n\u00eb GitHub Packages p\u00ebr dy minuta e 20 sekonda:<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Disa k\u00ebshilla p\u00ebr t\u00eb p\u00ebrshpejtuar nd\u00ebrtimin e imazheve Docker. P\u00ebr shembull, deri n\u00eb 30 sekonda\" src=\"\/wp-content\/uploads\/2020\/05\/76b81216922f7ef2c4e777b60238acd5.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Tani do ta ndryshojm\u00eb nd\u00ebrtimin duke p\u00ebrdorur nj\u00eb cache t\u00eb bazuar n\u00eb imazhet e nd\u00ebrtuara m\u00eb par\u00eb:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">n\u00eb:\n  shtyp:\n    deget:\n      - master\n\nemri: Test docker build\n\npun\u00ebt:\n  shp\u00ebrndaj:\n    emri: Build\n    funksionon n\u00eb: ubuntu-latest\n    mjedisi:\n      IMAGE_NAME: docker.pkg.github.com\/${{ github.repository }}\/app\n      IMAGE_TAG: ${{ github.sha }}\n\n    hapat:\n    - emri: Kontrollo\n      p\u00ebrdor: actions\/checkout@v2\n\n    - emri: Hyra n\u00eb GitHub Packages\n      mjedisi:\n        TOK\u00cbN: ${{ secrets.GITHUB_TOKEN }}\n      ekzekuto: |\n        docker login docker.pkg.github.com -u $GITHUB_ACTOR -p $TOK\u00cbN\n\n    - emri: T\u00ebrheq imazhet m\u00eb t\u00eb fundit\n      ekzekuto: |\n        docker pull $IMAGE_NAME:latest || true\n        docker pull $IMAGE_NAME-builder-stage:latest || true\n\n    - emri: Lista e imazheve\n      ekzekuto: |\n        docker images\n\n    - emri: Nd\u00ebrto\n      ekzekuto: |\n        docker build \n          --target builder \n          --cache-from $IMAGE_NAME-builder-stage:latest \n          -t $IMAGE_NAME-builder-stage \n          .\n        docker build \n          --cache-from $IMAGE_NAME-builder-stage:latest \n          --cache-from $IMAGE_NAME:latest \n          -t $IMAGE_NAME:$IMAGE_TAG \n          -t $IMAGE_NAME:latest \n          .\n\n    - emri: D\u00ebrgo imazhin n\u00eb GitHub Packages\n      ekzekuto: |\n        docker push $IMAGE_NAME-builder-stage:latest\n        docker push $IMAGE_NAME:latest\n        docker push $IMAGE_NAME:$IMAGE_TAG\n\n    - emri: Dalje\n      ekzekuto: |\n        docker logout docker.pkg.github.com<\/code><\/pre>\n<p><\/p>\n<p>S\u00eb pari, duhet t\u00eb shpjegojm\u00eb pse jan\u00eb duke u ekzekutuar dy komanda <code>build<\/code>. Kjo \u00ebsht\u00eb sepse n\u00eb nd\u00ebrtimin me shum\u00eb faza, rezultati do t\u00eb jet\u00eb nj\u00eb grup shtresash nga faza e fundit. Gjat\u00eb k\u00ebsaj, shtresat nga fazat e m\u00ebparshme nuk do t\u00eb p\u00ebrfshihen n\u00eb imazh. Prandaj, kur p\u00ebrdoret imazhi p\u00ebrfundimtar nga nd\u00ebrtimi i m\u00ebparsh\u00ebm, Docker nuk mund t\u00eb gjej\u00eb shtresat e gatshme p\u00ebr nd\u00ebrtimin e imazhit me nodejs (faz\u00ebn builder). P\u00ebr t\u00eb zgjidhur k\u00ebt\u00eb problem, krijohet nj\u00eb imazh nd\u00ebrmjet\u00ebs <code>$IMAGE_NAME-builder-stage<\/code> dhe d\u00ebrgohet n\u00eb GitHub Packages, n\u00eb m\u00ebnyr\u00eb q\u00eb t\u00eb mund t\u00eb p\u00ebrdoret n\u00eb nd\u00ebrtimin e ardhsh\u00ebm si burim cache.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Disa k\u00ebshilla p\u00ebr t\u00eb p\u00ebrshpejtuar nd\u00ebrtimin e imazheve Docker. P\u00ebr shembull, deri n\u00eb 30 sekonda\" src=\"\/wp-content\/uploads\/2020\/05\/acaa70ae528589f4be2258650d8eb5de.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Koha totale e nd\u00ebrtimit \u00ebsht\u00eb zvog\u00ebluar n\u00eb nj\u00eb minut\u00eb e gjysm\u00eb. Nj\u00eb gjysm\u00eb minute shpenzohet p\u00ebr t\u00eb t\u00ebrhequr imazhet e m\u00ebparshme.<\/p>\n<p><\/p>\n<h2 id=\"predvaritelnoe-sozdanie-obrazov\">Krijimi paraprak i imazheve<\/h2>\n<p><\/p>\n<p>Nj\u00eb tjet\u00ebr m\u00ebnyr\u00eb p\u00ebr t\u00eb zgjidhur problemin e memorie s\u00eb past\u00ebr t\u00eb Docker-it \u00ebsht\u00eb t\u00eb nxjerrim disa nga shtresat n\u00eb nj\u00eb Dockerfile tjet\u00ebr, ta nd\u00ebrtojm\u00eb at\u00eb ve\u00e7mas, ta shtypim n\u00eb Container Registry dhe ta p\u00ebrdorim si prind.<\/p>\n<p><\/p>\n<p>Krijojm\u00eb imazhin ton\u00eb nodejs p\u00ebr nd\u00ebrtimin e aplikacionit Angular. Krijojm\u00eb n\u00eb projekt Dockerfile.node<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">FROM node:12.16.2-alpine3.11\nRUN apk --no-cache --update --virtual build-dependencies add \n    python \n    make \n    g++<\/code><\/pre>\n<p><\/p>\n<p>Kujdesim dhe shtypim imazhin publik n\u00eb Docker Hub:<\/p>\n<p><\/p>\n<pre><code class=\"bash\">docker build -t exsmund\/node-for-angular -f Dockerfile.node .\ndocker push exsmund\/node-for-angular:latest<\/code><\/pre>\n<p><\/p>\n<p>Tani n\u00eb Dockerfile-in ton\u00eb p\u00ebrdorim imazhin e gatsh\u00ebm:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">FROM exsmund\/node-for-angular:latest as builder\n...<\/code><\/pre>\n<p><\/p>\n<p>N\u00eb shembullin ton\u00eb, koha e nd\u00ebrtimit nuk u zvog\u00eblua, por imazhet e krijuara paraprakisht mund t\u00eb jen\u00eb t\u00eb dobishme n\u00ebse keni shum\u00eb projekte dhe n\u00eb secilin prej tyre keni nevoj\u00eb p\u00ebr t\u00eb instaluar t\u00eb nj\u00ebjtat var\u00ebsi.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Disa k\u00ebshilla p\u00ebr t\u00eb p\u00ebrshpejtuar nd\u00ebrtimin e imazheve Docker. P\u00ebr shembull, deri n\u00eb 30 sekonda\" src=\"\/wp-content\/uploads\/2020\/05\/5b4e4bd1d4b96a3f07305d2dd0f6d680.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Ne shqyrtuam disa metoda p\u00ebr t\u00eb p\u00ebrshpejtuar nd\u00ebrtimin e imazheve Docker. N\u00ebse d\u00ebshironi q\u00eb implementimi t\u00eb kaloj\u00eb shpejt, provo t\u00eb aplikosh n\u00eb projektin t\u00ebnd:<\/p>\n<p><\/p>\n<ul>\n<li>p\u00ebr t\u00eb ulur kontekstin;<\/li>\n<li>p\u00ebrdorimin e imazheve prind t\u00eb vogla;<\/li>\n<li>nd\u00ebrtimin me shum\u00eb faza;<\/li>\n<li>ndryshimin e rendit t\u00eb instrukcioneve n\u00eb Dockerfile, p\u00ebr t\u00eb p\u00ebrdorur n\u00eb m\u00ebnyr\u00eb efektive memorien cache;<\/li>\n<li>konfigurimin e cache-it n\u00eb sistemet CI\/CD;<\/li>\n<li>krijimin paraprak t\u00eb imazheve.<\/li>\n<\/ul>\n<p><\/p>\n<p>Shpresoj se n\u00eb shembull do t\u00eb b\u00ebhet m\u00eb e qart\u00eb se si funksionon Docker dhe ju do t\u00eb jeni n\u00eb gjendje ta konfiguroni n\u00eb m\u00ebnyr\u00eb optimale implementimin tuaj. P\u00ebr t\u00eb luajtur me shembujt nga artikulli, \u00ebsht\u00eb krijuar nj\u00eb repository. <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/devopsprodigy\/test-docker-build\">https:\/\/github.com\/devopsprodigy\/test-docker-build<\/a><\/noindex>.<\/p>\n<p>Burimi: <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/itsumma\/blog\/501680\/\">habr.com<\/a> <\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>\u041f\u0440\u0435\u0436\u0434\u0435 \u0447\u0435\u043c \u0444\u0438\u0447\u0430 \u043f\u043e\u043f\u0430\u0434\u0435\u0442 \u043d\u0430 \u043f\u0440\u043e\u0434, \u0432 \u043d\u0430\u0448\u0435 \u0432\u0440\u0435\u043c\u044f \u0441\u043b\u043e\u0436\u043d\u044b\u0445 \u043e\u0440\u043a\u0435\u0441\u0442\u0440\u0430\u0442\u043e\u0440\u043e\u0432 \u0438 CI\/CD \u043f\u0440\u0435\u0434\u0441\u0442\u043e\u0438\u0442 \u043f\u0440\u043e\u0439\u0442\u0438 \u0434\u043e\u043b\u0433\u0438\u0439 \u043f\u0443\u0442\u044c \u043e\u0442 \u043a\u043e\u043c\u043c\u0438\u0442\u0430 \u0434\u043e \u0442\u0435\u0441\u0442\u043e\u0432 \u0438 \u0434\u043e\u0441\u0442\u0430\u0432\u043a\u0438. \u0420\u0430\u043d\u044c\u0448\u0435 \u043c\u043e\u0436\u043d\u043e \u0431\u044b\u043b\u043e \u043a\u0438\u043d\u0443\u0442\u044c \u043d\u043e\u0432\u044b\u0435 \u0444\u0430\u0439\u043b\u044b \u043f\u043e FTP (\u0442\u0430\u043a \u0431\u043e\u043b\u044c\u0448\u0435 \u0442\u0430\u043a \u043d\u0438\u043a\u0442\u043e \u043d\u0435 \u0434\u0435\u043b\u0430\u0435\u0442, \u0432\u0435\u0440\u043d\u043e?), \u0438 \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u00ab\u0434\u0435\u043f\u043b\u043e\u044f\u00bb \u0437\u0430\u043d\u0438\u043c\u0430\u043b \u0441\u0435\u043a\u0443\u043d\u0434\u044b. \u0422\u0435\u043f\u0435\u0440\u044c \u0436\u0435 \u043d\u0430\u0434\u043e \u0441\u043e\u0437\u0434\u0430\u0442\u044c merge request \u0438 \u0436\u0434\u0430\u0442\u044c \u043d\u0435\u043c\u0430\u043b\u043e\u0435 \u0432\u0440\u0435\u043c\u044f, \u043f\u043e\u043a\u0430 \u0444\u0438\u0447\u0430 [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":81601,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[688],"tags":[],"class_list":["post-81600","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-administrirovanie"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 5.0.2 - aioseo.com -->\n\t<meta name=\"description\" content=\"\u041f\u0440\u0435\u0436\u0434\u0435 \u0447\u0435\u043c \u0444\u0438\u0447\u0430 \u043f\u043e\u043f\u0430\u0434\u0435\u0442 \u043d\u0430 \u043f\u0440\u043e\u0434, \u0432 \u043d\u0430\u0448\u0435 \u0432\u0440\u0435\u043c\u044f \u0441\u043b\u043e\u0436\u043d\u044b\u0445 \u043e\u0440\u043a\u0435\u0441\u0442\u0440\u0430\u0442\u043e\u0440\u043e\u0432 \u0438 CI\/CD \u043f\u0440\u0435\u0434\u0441\u0442\u043e\u0438\u0442 \u043f\u0440\u043e\u0439\u0442\u0438 \u0434\u043e\u043b\u0433\u0438\u0439 \u043f\u0443\u0442\u044c \u043e\u0442 \u043a\u043e\u043c\u043c\u0438\u0442\u0430 \u0434\u043e \u0442\u0435\u0441\u0442\u043e\u0432 \u0438 \u0434\u043e\u0441\u0442\u0430\u0432\u043a\u0438.\" \/>\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\/administrirovanie\/neskolko-sovetov-o-tom-kak-uskorit-sborku-docker-obrazov-naprimer-do-30-sekund\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.2\" \/>\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\u041d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0441\u043e\u0432\u0435\u0442\u043e\u0432 \u043e \u0442\u043e\u043c, \u043a\u0430\u043a \u0443\u0441\u043a\u043e\u0440\u0438\u0442\u044c \u0441\u0431\u043e\u0440\u043a\u0443 Docker-\u043e\u0431\u0440\u0430\u0437\u043e\u0432. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0434\u043e 30 \u0441\u0435\u043a\u0443\u043d\u0434 | ProHoster\" \/>\n\t\t<meta property=\"og:description\" content=\"\u041f\u0440\u0435\u0436\u0434\u0435 \u0447\u0435\u043c \u0444\u0438\u0447\u0430 \u043f\u043e\u043f\u0430\u0434\u0435\u0442 \u043d\u0430 \u043f\u0440\u043e\u0434, \u0432 \u043d\u0430\u0448\u0435 \u0432\u0440\u0435\u043c\u044f \u0441\u043b\u043e\u0436\u043d\u044b\u0445 \u043e\u0440\u043a\u0435\u0441\u0442\u0440\u0430\u0442\u043e\u0440\u043e\u0432 \u0438 CI\/CD \u043f\u0440\u0435\u0434\u0441\u0442\u043e\u0438\u0442 \u043f\u0440\u043e\u0439\u0442\u0438 \u0434\u043e\u043b\u0433\u0438\u0439 \u043f\u0443\u0442\u044c \u043e\u0442 \u043a\u043e\u043c\u043c\u0438\u0442\u0430 \u0434\u043e \u0442\u0435\u0441\u0442\u043e\u0432 \u0438 \u0434\u043e\u0441\u0442\u0430\u0432\u043a\u0438.\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/sq\/blog\/administrirovanie\/neskolko-sovetov-o-tom-kak-uskorit-sborku-docker-obrazov-naprimer-do-30-sekund\" \/>\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-05-14T23:42:41+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2020-05-14T23:42:41+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\udd47Disa k\u00ebshilla p\u00ebr t\u00eb p\u00ebrshpejtuar nd\u00ebrtimin e imazheve Docker. P\u00ebr shembull, deri n\u00eb 30 sekonda | ProHoster","description":"Para se t\u00eb kaloj\u00eb n\u00eb prodhim, n\u00eb koh\u00ebn ton\u00eb t\u00eb orkestrator\u00ebve t\u00eb komplikuar dhe CI\/CD, duhet t\u00eb kaloj\u00eb nj\u00eb rrug\u00eb t\u00eb gjat\u00eb nga commit-i deri te testet dhe shp\u00ebrndarja.","canonical_url":"https:\/\/prohoster.info\/sq\/blog\/administrirovanie\/neskolko-sovetov-o-tom-kak-uskorit-sborku-docker-obrazov-naprimer-do-30-sekund","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\u041d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0441\u043e\u0432\u0435\u0442\u043e\u0432 \u043e \u0442\u043e\u043c, \u043a\u0430\u043a \u0443\u0441\u043a\u043e\u0440\u0438\u0442\u044c \u0441\u0431\u043e\u0440\u043a\u0443 Docker-\u043e\u0431\u0440\u0430\u0437\u043e\u0432. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0434\u043e 30 \u0441\u0435\u043a\u0443\u043d\u0434 | ProHoster","og:description":"\u041f\u0440\u0435\u0436\u0434\u0435 \u0447\u0435\u043c \u0444\u0438\u0447\u0430 \u043f\u043e\u043f\u0430\u0434\u0435\u0442 \u043d\u0430 \u043f\u0440\u043e\u0434, \u0432 \u043d\u0430\u0448\u0435 \u0432\u0440\u0435\u043c\u044f \u0441\u043b\u043e\u0436\u043d\u044b\u0445 \u043e\u0440\u043a\u0435\u0441\u0442\u0440\u0430\u0442\u043e\u0440\u043e\u0432 \u0438 CI\/CD \u043f\u0440\u0435\u0434\u0441\u0442\u043e\u0438\u0442 \u043f\u0440\u043e\u0439\u0442\u0438 \u0434\u043e\u043b\u0433\u0438\u0439 \u043f\u0443\u0442\u044c \u043e\u0442 \u043a\u043e\u043c\u043c\u0438\u0442\u0430 \u0434\u043e \u0442\u0435\u0441\u0442\u043e\u0432 \u0438 \u0434\u043e\u0441\u0442\u0430\u0432\u043a\u0438.","og:url":"https:\/\/prohoster.info\/sq\/blog\/administrirovanie\/neskolko-sovetov-o-tom-kak-uskorit-sborku-docker-obrazov-naprimer-do-30-sekund","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-05-14T23:42:41+00:00","article:modified_time":"2020-05-14T23:42:41+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"81600","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 15:55:42","updated":"2022-09-29 02:10:06","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\/81600","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=81600"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/sq\/wp-json\/wp\/v2\/posts\/81600\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/sq\/wp-json\/wp\/v2\/media\/81601"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/sq\/wp-json\/wp\/v2\/media?parent=81600"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/sq\/wp-json\/wp\/v2\/categories?post=81600"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/sq\/wp-json\/wp\/v2\/tags?post=81600"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}