{"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\/et\/blog\/administrirovanie\/neskolko-sovetov-o-tom-kak-uskorit-sborku-docker-obrazov-naprimer-do-30-sekund","title":{"rendered":"M\u00f5ned n\u00f5uanded, kuidas kiirendada Docker-piltide koostamist. N\u00e4iteks kuni 30 sekundit","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>Enne kui funktsioon j\u00f5uab tootmisse, peab see praeguste keeruliste orkestratorite ja CI\/CD s\u00fcsteemide t\u00f5ttu l\u00e4bima pika tee koodiversioonist testimise ja kohaletoimetamiseni. Varem v\u00f5is uusi faile lihtsalt FTP kaudu laadida (nii ei tee keegi enam, eks?), ja \u201edeploidi\u201d protsess kestis sekundeid. N\u00fc\u00fcd tuleb luua merge-p\u00e4ring ja oodata m\u00e4rkimisv\u00e4\u00e4rselt kaua, kuni funktsioon kasutajateni j\u00f5uab.<\/p>\n<p><\/p>\n<p>Osana sellest teest toimub Docker-pildi kogumine. M\u00f5nikord kestab kogumine minuteid, m\u00f5nikord aga k\u00fcmneid minuteid, mida on raske normaalseks nimetada. K\u00e4esolevas artiklis v\u00f5tame lihtsa rakenduse, pakime selle pildiks, rakendame mitmeid meetodeid kogumise kiirendamiseks ja vaatame nende meetodite toimimise n\u00fcansse.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"M\u00f5ned n\u00f5uanded, kuidas kiirendada Docker-piltide koostamist. N\u00e4iteks kuni 30 sekundit\" 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>Meil on hea kogemus meedia saitide loomisel ja hooldamisel: <noindex><a rel=\"nofollow\" href=\"https:\/\/tass.ru\/\">\u0422\u0410\u0421\u0421<\/a><\/noindex>, <noindex><a rel=\"nofollow\" href=\"https:\/\/thebell.io\/\">The Bell<\/a><\/noindex>, <noindex><a rel=\"nofollow\" href=\"https:\/\/novayagazeta.ru\/\">&quot;\u041d\u043e\u0432\u0430\u044f \u0433\u0430\u0437\u0435\u0442\u0430&quot;<\/a><\/noindex>, <noindex><a rel=\"nofollow\" href=\"https:\/\/republic.ru\/\">Republic<\/a><\/noindex>\u2026\u00c4sja t\u00e4iendasime oma portfelli, lastes tootmisse saidi <noindex><a rel=\"nofollow\" href=\"https:\/\/reminder.media\">Reminder<\/a><\/noindex>. Ja samal ajal kui me kiiresti uusi funktsioone viimistlesime ja vanu vigu parandasime, sai aeglane deploiimisprotsess suureks probleemiks.<\/p>\n<p><\/p>\n<p>Teostame deploiimist GitLab-is. Kogume pilte, push'ime need GitLabi registrisse ja kaevame need tootmisse. Selle nimekirja k\u00f5ige aeglasem osa on piltide kogumine. N\u00e4iteks: ilma optimeerimiseta kestis iga taustaprogrammi kogumine 14 minutit.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"M\u00f5ned n\u00f5uanded, kuidas kiirendada Docker-piltide koostamist. N\u00e4iteks kuni 30 sekundit\" src=\"\/wp-content\/uploads\/2020\/05\/043bc8ad67c34e1c7bd705433c5e4e77.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>L\u00f5puks sai selgeks, et selliselt elada enam ei saa, ja me asusime arutama, miks pildid nii kaua kokku kogunevad. L\u00f5puks \u00f5nnestus kokkupanemisaega v\u00e4hendada 30 sekundini!<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"M\u00f5ned n\u00f5uanded, kuidas kiirendada Docker-piltide koostamist. N\u00e4iteks kuni 30 sekundit\" src=\"\/wp-content\/uploads\/2020\/05\/d035eb1c7b95e0345a110ee59f472693.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>\u0414\u043b\u044f \u0434\u0430\u043d\u043d\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0438, \u0447\u0442\u043e\u0431\u044b \u043d\u0435 \u043f\u0440\u0438\u0432\u044f\u0437\u044b\u0432\u0430\u0442\u044c\u0441\u044f \u043a \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u044e Reminder&#8217;\u0430, \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043f\u0440\u0438\u043c\u0435\u0440 \u0441\u0431\u043e\u0440\u043a\u0438 \u043f\u0443\u0441\u0442\u043e\u0433\u043e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u043d\u0430 Angular. \u0418\u0442\u0430\u043a, \u0441\u043e\u0437\u0434\u0430\u0451\u043c \u043d\u0430\u0448\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435:<\/p>\n<p><\/p>\n<pre><code class=\"bash\">ng n app<\/code><\/pre>\n<p><\/p>\n<p>Lisame sellele PWA (me ju oleme progressiivsed):<\/p>\n<p><\/p>\n<pre><code class=\"bash\">ng add @angular\/pwa --project app<\/code><\/pre>\n<p><\/p>\n<p>Kui alla laaditakse miljonit npm-paketti, vaatame, kuidas docker-pilt koosneb. Docker v\u00f5imaldab rakendusi pakendada ja k\u00e4ivitada neid isoleeritud keskkonnas, mida nimetatakse konteineriks. T\u00e4nu isoleerimisele saab samaaegselt k\u00e4ivitada palju konteinerite \u00fchel serveril. Konteinerid on oluliselt kergemad kui virtuaalsed masinad, kuna need t\u00f6\u00f6tavad otse s\u00fcsteemi tuumal. Et k\u00e4ivitada konteinerit meie rakendusega, peame esmalt looma pildi, kuhu pakime k\u00f5ik, mis meie rakenduse t\u00f6\u00f6tamiseks vajalik. Sisuliselt on pilt - see on failis\u00fcsteemi koopia. N\u00e4iteks v\u00f5tame 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 \u2014 see on juhiste kogum; iga juhise t\u00e4itmisega salvestab Docker muudatused failis\u00fcsteemis ja rakendab neid eelnevatele. Iga k\u00e4sk loob oma kihi. Valmis pilt on koositatud kihtidest.<\/p>\n<p><\/p>\n<p>Oluline teada: iga kiht on Dockeris vahem\u00e4llu salvestatav. Kui viimase koostamisega ei ole midagi muutunud, siis v\u00f5tab Docker k\u00e4sku t\u00e4itmata juba valmis kihi. Kuna peamine kiiruset\u00f5us koostamisel tuleb vahem\u00e4lu kasutamisest, siis keskendume kiirusem\u00f5\u00f5tmiste ajal just pildi koostamisele valmis vahem\u00e4luga. Nii et j\u00e4rgime samme:<\/p>\n<p><\/p>\n<ol>\n<li>Kustutame kohalikud pildid, et eelnevad k\u00e4ivitamised ei m\u00f5jutaks testi.<br \/>\n<code>docker rmi $(docker images -q)<\/code><\/li>\n<li>K\u00e4ivitame ehituse esmakordselt.<br \/>\n<code>time docker build -t app .<\/code><\/li>\n<li>Muudame faili src\/index.html \u2014 simuleerime programmeerija t\u00f6\u00f6d.<\/li>\n<li>K\u00e4ivitame ehituse teist korda.<br \/>\n<code>time docker build -t app .<\/code><\/li>\n<\/ol>\n<p><\/p>\n<p>Kui pildikogumise keskkond on \u00f5igesti seadistatud (millest r\u00e4\u00e4gime veidi allpool), siis Dockeril on pildikoostamise k\u00e4ivitamisel juba olemas hulk vahem\u00e4lu. Meie eesm\u00e4rk on \u00f5ppida, kuidas vahem\u00e4lu kasutada nii, et koostamine toimuks v\u00f5imalikult kiiresti. Oletame, et koostamise k\u00e4ivitamine ilma vahem\u00e4luta toimub ainult \u00fcks kord \u2014 esmakordselt \u2014 seega saame ignoreerida, kui aeglane oli see esimene kord. Testides on meie jaoks oluliseks teiseks koostamiseks, kui vahem\u00e4lud on juba soojendatud ja oleme valmis k\u00fcpsetama oma kooki. Sellegipoolest m\u00f5ningad n\u00e4pun\u00e4ited m\u00f5jutavad ka esimest koostamist.<\/p>\n<p><\/p>\n<p>Asetame \u00fclaltoodud Dockerfile projekti kausta ja k\u00e4ivitame koostamise. K\u00f5ik esitatud loetelud on mugavuse huvides l\u00fchendatud.<\/p>\n<p><\/p>\n<pre><code class=\"bash\">$ time docker build -t app .\nSaadan ehituskonteksti Docker daemonile 409MB\nSamm 1\/5 : FROM node:12.16.2\nOlek: Laaditud uuem pilt node:12.16.2\nSamm 2\/5 : WORKDIR \/app\nSamm 3\/5 : COPY . .\nSamm 4\/5 : RUN npm ci\nlisa 1357 paketti 22.47s\nSamm 5\/5 : RUN npm run build --prod\nKuup\u00e4ev: 2020-04-16T19:20:09.664Z - Hash: fffa0fddaa3425c55dd3 - Aeg: 37581ms\nEdukas koostamine: c8c279335f46\nEdukas m\u00e4rgistamine: app:latest\n\nreaalne 5m4.541s\nkasutaja 0m0.000s\ns\u00fcsteem 0m0.000s<\/code><\/pre>\n<p><\/p>\n<p>Muudame sisu src\/index.html ja k\u00e4ivitame teist korda.<\/p>\n<p><\/p>\n<pre><code class=\"bash\">$ time docker build -t app .\nSending build context to Docker daemon 409MB\nStep 1\/5 : FROM node:12.16.2\nStep 2\/5 : WORKDIR \/app\n --- &gt; Using cache\nStep 3\/5 : COPY . .\nStep 4\/5 : RUN npm ci\nadded 1357 packages in 22.47s\nStep 5\/5 : RUN npm run build --prod\nDate: 2020-04-16T19:26:26.587Z - Hash: fffa0fddaa3425c55dd3 - Time: 37902ms\nSuccessfully built 79f335df92d3\nSuccessfully tagged app:latest\n\nreal 3m33.262s\nuser 0m0.000s\nsys 0m0.000s<\/code><\/pre>\n<p><\/p>\n<p>Vaadates, kas meie pilt on valmis, k\u00e4ivitame k\u00e4su <code>docker images<\/code>:<\/p>\n<p><\/p>\n<pre><code class=\"bash\">REPOSITORY   TAG      IMAGE ID       CREATED              SIZE\napp          latest   79f335df92d3   About a minute ago   1.74GB<\/code><\/pre>\n<p><\/p>\n<p>Enne koostamist kogub docker k\u00f5ik failid praegusest kontekstist ja saadab need oma deemonile <code>Sending build context to Docker daemon 409MB<\/code>. Koostamiskontekst m\u00e4\u00e4ratakse k\u00e4skluse build viimaseks argumendiks. Meie puhul on see praegune kataloog \u2014 \u00ab.\u00bb, \u2014 ja docker toob k\u00f5ik, mis meil selles kaustas on. 409 MB on palju: m\u00f5elgem, kuidas seda parandada.<\/p>\n<p><\/p>\n<h2 id=\"umenshaem-kontekst\">Konteksti v\u00e4hendamine<\/h2>\n<p><\/p>\n<p>Konteksti v\u00e4hendamiseks on kaks v\u00f5imalust. Kas panna k\u00f5ik koostamiseks vajalikud failid eraldi kausta ja n\u00e4idata dockerile konteksti just sellele kaustale. See ei pruugi alati mugav olla, seega on v\u00f5imalik n\u00e4idata erandeid: mida ei peaks konteksti tooma. Selleks paneme projekti faili .dockerignore ja n\u00e4itame, mis ei ole koostamiseks vajalik:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">.git\n\/node_modules<\/code><\/pre>\n<p><\/p>\n<p>ja k\u00e4ivitame koostamise uuesti:<\/p>\n<p><\/p>\n<pre><code class=\"bash\">$ time docker build -t app .\nSending build context to Docker daemon 607.2kB\nStep 1\/5 : FROM node:12.16.2\nStep 2\/5 : WORKDIR \/app\n ---&gt; Using cache\nStep 3\/5 : COPY . .\nStep 4\/5 : RUN npm ci\nadded 1357 packages in 22.47s\nStep 5\/5 : RUN npm run build --prod\nDate: 2020-04-16T19:33:54.338Z - Hash: fffa0fddaa3425c55dd3 - Time: 37313ms\nSuccessfully built 4942f010792a\nSuccessfully tagged app:latest\n\nreal 1m47.763s\nuser 0m0.000s\nsys 0m0.000s<\/code><\/pre>\n<p><\/p>\n<p>607.2 KB \u2014 palju parem kui 409 MB. Samuti v\u00e4hendasime pildi suurust 1.74 GB-lt 1.38 GB-le:<\/p>\n<p><\/p>\n<pre><code class=\"bash\">REPOSITORY   TAG      IMAGE ID       CREATED         SIZE\napp          latest   4942f010792a   3 minutes ago   1.38GB<\/code><\/pre>\n<p><\/p>\n<p>Katsume veel pildi suurust v\u00e4hendada.<\/p>\n<p><\/p>\n<h2 id=\"ispolzuem-alpine\">Kasutame Alpine'i<\/h2>\n<p><\/p>\n<p>Veel \u00fcks viis pildi suuruse kokkuhoiuks on kasutada v\u00e4ikest vanemapilti. Vanemapilt on see pilt, mille p\u00f5hjal meie pilt valmistatakse. Alumine kiht m\u00e4\u00e4ratakse k\u00e4suga <code>FROM<\/code> Dockerfile'is. Meie puhul kasutame Ubuntu-p\u00f5hist pilti, kus on juba nodejs. Ja selle kaal on \u2026<\/p>\n<p><\/p>\n<pre><code class=\"bash\">$ docker images -a | grep node\nnode 12.16.2 406aa3abbc6c 17 minutes ago 916MB<\/code><\/pre>\n<p><\/p>\n<p>\u2026 peaaegu gigabait. Mahtu saab tunduvalt v\u00e4hendada, kasutades Alpine Linux-p\u00f5hist pilti. Alpine on v\u00e4ga v\u00e4ike Linux. Nodejs-i Docker-pilt, mis p\u00f5hineb Alpine'il, kaalub ainult 88.5 MB. Seet\u00f5ttu asendame meie suure pildi:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">MUUTU 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>Pidime paigaldama m\u00f5ned asjad, mis on vajalikud rakenduse ehitamiseks. Jah, Angular ei ehita ilma Pythonita \u00af(\u00b0_o)\/\u00af<\/p>\n<p><\/p>\n<p>Aga pildi suurus v\u00e4henes 150 MB v\u00f5rra:<\/p>\n<p><\/p>\n<pre><code class=\"bash\">REPOSITORY   TAG      IMAGE ID       CREATED          SIZE\napp          latest   aa031edc315a   22 minutes ago   761MB<\/code><\/pre>\n<p><\/p>\n<p>Liigume veel edasi.<\/p>\n<p><\/p>\n<h2 id=\"multisteydzh-sborka\">Mitme etapi ehitus<\/h2>\n<p><\/p>\n<p>K\u00f5ik, mis pildis on, pole meile tootmises vajalik.<\/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>K\u00e4esoleva abil <code>docker run app ls -lah<\/code> me k\u00e4ivitasime konteineri meie pildilt <code>app<\/code> ja t\u00e4itsime seal k\u00e4su <code>ls -lah<\/code>, p\u00e4rast mida konteiner l\u00f5petas oma t\u00f6\u00f6d.<\/p>\n<p><\/p>\n<p>Tootmises vajame ainult kausta <code>dist<\/code>. Samal ajal on faile kuidagi vaja v\u00e4lja anda. Saame k\u00e4ivitada mingisuguse HTTP-serveri nodejs-is. Aga teeme lihtsamalt. Arva \u00e4ra vene s\u00f5na, milles on neli t\u00e4hte \"\u044b\". \u00d5ige! \u042b\u043d\u0436\u044b\u043d\u044b\u043a\u0441\u044b. V\u00f5tame nginx'i pildi, paneme sinna kausta <code>dist<\/code> ja v\u00e4ikese konfiguratsiooni:<\/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>Selle k\u00f5ikide tegemiseks aitab meid multi-stage build. Muudame meie Dockerfile'i:<\/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>N\u00fc\u00fcd on meil kaks k\u00e4sklust <code>FROM<\/code> Dockerfile'is, millest iga\u00fcks k\u00e4ivitab oma ehitusetapi. Esimesele andsime nime <code>builder<\/code>, ja alates viimasest FROM-ist hakatakse meie l\u00f5plikku pilti ette valmistama. Viimase sammuna kopeerime meie eelneva etapi ehitusartefakti l\u00f5pp- tagasi nginx-i. Pildi suurus on oluliselt v\u00e4henenud:<\/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>K\u00e4ivitame konteineri meie pildiga ja veendume, et k\u00f5ik t\u00f6\u00f6tab:<\/p>\n<p><\/p>\n<pre><code class=\"bash\">docker run -p8080:80 app<\/code><\/pre>\n<p><\/p>\n<p>Argument -p8080:80 suunab meie hostmasinas 8080 pordi 80 porti konteineris, kus t\u00f6\u00f6tab nginx. Avame brauseris <noindex><a rel=\"nofollow\" href=\"http:\/\/localhost:8080\/\">http:\/\/localhost:8080\/<\/a><\/noindex> ja n\u00e4eme meie rakendust. K\u00f5ik t\u00f6\u00f6tab!<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"M\u00f5ned n\u00f5uanded, kuidas kiirendada Docker-piltide koostamist. N\u00e4iteks kuni 30 sekundit\" src=\"\/wp-content\/uploads\/2020\/05\/ab37d9576a84954f4e4860dd49a75f3d.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Pildi suuruse v\u00e4hendamine 1.74 GB-st 36 MB-ni l\u00fchendab oluliselt teie rakenduse tootmisesse toimetamise aega. Kuid naaseme ehitusaega.<\/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\">Muudame kihtide j\u00e4rjekorda<\/h2>\n<p><\/p>\n<p>Esimesed kolm sammu olid meil vahem\u00e4lus (vihje <code>Using cache<\/code>). Neljandas etapis kopeeritakse k\u00f5ik projekti failid ja viiendas etapis paigaldatakse s\u00f5ltuvused <code>RUN npm ci<\/code> \u2014 kokku 47,338 s. Miks paigaldada s\u00f5ltuvused iga kord uuesti, kui need muutuvad v\u00e4ga harva? Vaatame, miks nad ei ole vahem\u00e4lusse salvestatud. Asi on selles, et Docker kontrollib kiht kihi haaval, kas k\u00e4sk ja sellega seotud failid on muutunud. Neljandas sammus kopeerime k\u00f5ik meie projekti failid ja nende seas on loomulikult muudatused, mist\u00f5ttu Docker ei kasuta mitte ainult seda kihti vahem\u00e4lust, vaid k\u00f5iki j\u00e4rgmisi! Teeme Dockerfile'is v\u00e4iksed muudatused.<\/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>Esmalt kopeeritakse package.json ja package-lock.json, seej\u00e4rel paigaldatakse s\u00f5ltuvused ja alles p\u00e4rast seda kopeeritakse kogu projekt. Tulemuseks:<\/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 sekundit kolme minuti asemel \u2014 oluliselt parem! Oluline on kihtide \u00f5ige j\u00e4rjekord: esmalt kopeerime selle, mis ei muutu, seej\u00e4rel selle, mis harva muutub, ja l\u00f5puks \u2014 selle, mis sageli.<\/p>\n<p><\/p>\n<p>J\u00e4tkame natuke juttu pildihaldusest CI\/CD s\u00fcsteemides.<\/p>\n<p><\/p>\n<h2 id=\"ispolzovanie-predyduschih-obrazov-dlya-kesha\">Eelmiste piltide kasutamine vahehoiuna<\/h2>\n<p><\/p>\n<p>Kui me kasutame mingit SaaS-lahendust ehitamiseks, siis v\u00f5ib kohalik Docker'i vahehoidla olla puhas ja v\u00e4rske. Et Docker'il oleks kust v\u00f5tta k\u00fcpsetatud kihte, andke talle eelnevalt kokku pandud pilt.<\/p>\n<p><\/p>\n<p>Vaatame n\u00e4iteks meie rakenduse ehitamist GitHub Actionsis. Kasutame sellist konfi<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">kas:\n  push:\n    branches:\n      - master\n\nname: Test docker build\n\njobs:\n  deploy:\n    name: Build\n    runs-on: ubuntu-latest\n    env:\n      IMAGE_NAME: docker.pkg.github.com\/${{ github.repository }}\/app\n      IMAGE_TAG: ${{ github.sha }}\n\n    steps:\n    - name: Checkout\n      uses: actions\/checkout@v2\n\n    - name: Login to GitHub Packages\n      env:\n        TOKEN: ${{ secrets.GITHUB_TOKEN }}\n      run: |\n        docker login docker.pkg.github.com -u $GITHUB_ACTOR -p $TOKEN\n\n    - name: Build\n      run: |\n        docker build \n          -t $IMAGE_NAME:$IMAGE_TAG \n          -t $IMAGE_NAME:latest \n          .\n\n    - name: Push image to GitHub Packages\n      run: |\n        docker push $IMAGE_NAME:latest\n        docker push $IMAGE_NAME:$IMAGE_TAG\n\n    - name: Logout\n      run: |\n        docker logout docker.pkg.github.com<\/code><\/pre>\n<p><\/p>\n<p>Pilt kogutakse ja saadetakse GitHub Packagesi kahe minuti ja 20 sekundi jooksul:<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"M\u00f5ned n\u00f5uanded, kuidas kiirendada Docker-piltide koostamist. N\u00e4iteks kuni 30 sekundit\" src=\"\/wp-content\/uploads\/2020\/05\/76b81216922f7ef2c4e777b60238acd5.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>N\u00fc\u00fcd muudame kogumise nii, et kasutame varasemate kogutud piltide p\u00f5hjal vahem\u00e4lu:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">on:\n  push:\n    branches:\n      - master\n\nname: Test docker build\n\njobs:\n  deploy:\n    name: Build\n    runs-on: ubuntu-latest\n    env:\n      IMAGE_NAME: docker.pkg.github.com\/${{ github.repository }}\/app\n      IMAGE_TAG: ${{ github.sha }}\n\n    steps:\n    - name: Checkout\n      uses: actions\/checkout@v2\n\n    - name: Login to GitHub Packages\n      env:\n        TOKEN: ${{ secrets.GITHUB_TOKEN }}\n      run: |\n        docker login docker.pkg.github.com -u $GITHUB_ACTOR -p $TOKEN\n\n    - name: Pull latest images\n      run: |\n        docker pull $IMAGE_NAME:latest || true\n        docker pull $IMAGE_NAME-builder-stage:latest || true\n\n    - name: Images list\n      run: |\n        docker images\n\n    - name: Build\n      run: |\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    - name: Push image to GitHub Packages\n      run: |\n        docker push $IMAGE_NAME-builder-stage:latest\n        docker push $IMAGE_NAME:latest\n        docker push $IMAGE_NAME:$IMAGE_TAG\n\n    - name: Logout\n      run: |\n        docker logout docker.pkg.github.com<\/code><\/pre>\n<p><\/p>\n<p>Esiteks on vaja r\u00e4\u00e4kida, miks k\u00e4ivitatakse kaks k\u00e4sku <code>build<\/code>. Probleem on selles, et mitmeetapise ehituse tulemusena on komplekt kihte viimasest etapist. Eelmiste kihtide kihid ei j\u00f5ua pildile. Seega, kui kasutada viimast pilti eelmisest ehitusest, ei suuda Docker leida valmis kihte nodejs pildi (ehitusetapp builder) koostamiseks. Selle probleemi lahendamiseks luuakse vahepilt <code>$IMAGE_NAME-builder-stage<\/code> ja saadetakse GitHub Packages'i, et seda saaks kasutada j\u00e4rgmises ehituses vahekaustana.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"M\u00f5ned n\u00f5uanded, kuidas kiirendada Docker-piltide koostamist. N\u00e4iteks kuni 30 sekundit\" src=\"\/wp-content\/uploads\/2020\/05\/acaa70ae528589f4be2258650d8eb5de.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>\u00dcldine ehitusaeg on l\u00fchenenud \u00fche ja poole minutini. Pool minutit kulub eelmiste piltide t\u00f5mbamiseks.<\/p>\n<p><\/p>\n<h2 id=\"predvaritelnoe-sozdanie-obrazov\">Piltide eelneva loomine<\/h2>\n<p><\/p>\n<p>Veel \u00fcks viis Docker'i puhta vahecache probleemi lahendamiseks on osa kihtidest v\u00e4lja viia teise Dockerfile'i, ehitada see eraldi, pushida Container Registry'sse ja kasutada vanemana.<\/p>\n<p><\/p>\n<p>Loome oma nodejs pildi Angular rakenduse koostamiseks. Loome projektis 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>Kogume ja pushime avaliku pildi Docker Hubi:<\/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>N\u00fc\u00fcd kasutame oma p\u00f5hijuhendis valmis pilti:<\/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>Meie n\u00e4ites ei l\u00fchenenud ehitusaeg, kuid eelnevalt loodud pildid v\u00f5ivad olla kasulikud, kui teil on palju projekte, milles peate installima samu s\u00f5ltuvusi.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"M\u00f5ned n\u00f5uanded, kuidas kiirendada Docker-piltide koostamist. N\u00e4iteks kuni 30 sekundit\" src=\"\/wp-content\/uploads\/2020\/05\/5b4e4bd1d4b96a3f07305d2dd0f6d680.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Olemegi k\u00e4sitlenud mitmeid meetodeid Docker-piltide ehitamise kiirendamiseks. Kui soovite kiirusest lugu pidada, proovige oma projektis rakendada:<\/p>\n<p><\/p>\n<ul>\n<li>konteksti v\u00e4hendamine;<\/li>\n<li>v\u00e4ikeste vanemapiltide kasutamine;<\/li>\n<li>multi-stage ehitus;<\/li>\n<li>Dockerfile'i k\u00e4skude j\u00e4rjestuse muutmine koodi efektiivseks kasutamiseks;<\/li>\n<li>CI\/CD s\u00fcsteemides cache\u2019i seadistamine;<\/li>\n<li>piltide eelnev loomine.<\/li>\n<\/ul>\n<p><\/p>\n<p>Loodan, et n\u00e4idisest saab selgemaks, kuidas Docker t\u00f6\u00f6tab, ja et suudate oma seadistusi optimaalselt kohandada. Artikli n\u00e4idistega m\u00e4ngimiseks on loodud hoidla. <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/devopsprodigy\/test-docker-build\">https:\/\/github.com\/devopsprodigy\/test-docker-build<\/a><\/noindex>.<\/p>\n<p>Allikas: <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 4.9.10 - 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. \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\" \/>\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\/et\/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) 4.9.10\" \/>\n\t\t<meta property=\"og:locale\" content=\"et_EE\" \/>\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. \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\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/et\/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\udd47M\u00f5ned n\u00f5uanded, kuidas kiirendada Docker-piltide koostamist. N\u00e4iteks kuni 30 sekundit | ProHoster","description":"Enne kui funktsioon j\u00f5uab tootmisse, peab t\u00e4nap\u00e4evaste keerukate orkestratorite ja CI\/CD kaudu minema pikk tee commit'ist testimiseni ja tarnimiseni. Varem sai uusi faile FTP kaudu \u00fcles laadida (n\u00fc\u00fcd pole keegi enam nii teinud, eks?), ja \u201edeploimise\u201d protsess v\u00f5ttis sekundeid. N\u00fc\u00fcd tuleb luua merge request ja oodata pikalt, kuni funktsioon.","canonical_url":"https:\/\/prohoster.info\/et\/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":"et_EE","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. \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","og:url":"https:\/\/prohoster.info\/et\/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"},"gt_translate_keys":[{"key":"link","format":"url"}],"_links":{"self":[{"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/posts\/81600","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/comments?post=81600"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/posts\/81600\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/media\/81601"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/media?parent=81600"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/categories?post=81600"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/tags?post=81600"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}