MÔned nÔuanded, kuidas kiirendada Docker-piltide koostamist. NÀiteks kuni 30 sekundit

Enne kui funktsioon jĂ”uab tootmisse, peab see praeguste keeruliste orkestratorite ja CI/CD sĂŒsteemide tĂ”ttu lĂ€bima pika tee koodiversioonist testimise ja kohaletoimetamiseni. Varem vĂ”is uusi faile lihtsalt FTP kaudu laadida (nii ei tee keegi enam, eks?), ja „deploidi” protsess kestis sekundeid. NĂŒĂŒd tuleb luua merge-pĂ€ring ja oodata mĂ€rkimisvÀÀrselt kaua, kuni funktsioon kasutajateni jĂ”uab.

Osana sellest teest toimub Docker-pildi kogumine. MĂ”nikord kestab kogumine minuteid, mĂ”nikord aga kĂŒmneid minuteid, mida on raske normaalseks nimetada. KĂ€esolevas artiklis vĂ”tame lihtsa rakenduse, pakime selle pildiks, rakendame mitmeid meetodeid kogumise kiirendamiseks ja vaatame nende meetodite toimimise nĂŒansse.

MÔned nÔuanded, kuidas kiirendada Docker-piltide koostamist. NÀiteks kuni 30 sekundit

Meil on hea kogemus meedia saitide loomisel ja hooldamisel: йАХХ, The Bell, "ĐĐŸĐČая газДта", Republic
Äsja tĂ€iendasime oma portfelli, lastes tootmisse saidi Reminder. Ja samal ajal kui me kiiresti uusi funktsioone viimistlesime ja vanu vigu parandasime, sai aeglane deploiimisprotsess suureks probleemiks.

Teostame deploiimist GitLab-is. Kogume pilte, push'ime need GitLabi registrisse ja kaevame need tootmisse. Selle nimekirja kÔige aeglasem osa on piltide kogumine. NÀiteks: ilma optimeerimiseta kestis iga taustaprogrammi kogumine 14 minutit.

MÔned nÔuanded, kuidas kiirendada Docker-piltide koostamist. NÀiteks kuni 30 sekundit

LÔpuks sai selgeks, et selliselt elada enam ei saa, ja me asusime arutama, miks pildid nii kaua kokku kogunevad. LÔpuks Ônnestus kokkupanemisaega vÀhendada 30 sekundini!

MÔned nÔuanded, kuidas kiirendada Docker-piltide koostamist. NÀiteks kuni 30 sekundit

KĂ€esolevas artiklis, et mitte siduda end Reminder'i keskkonnaga, vaatame nĂ€idet tĂŒhja rakenduse koostamisest Angularis. Nii et loome oma rakenduse:

ng n app

Lisame sellele PWA (me ju oleme progressiivsed):

ng add @angular/pwa --project app

Kui alla laaditakse miljonit npm-paketti, vaatame, kuidas docker-pilt koosneb. Docker vĂ”imaldab rakendusi pakendada ja kĂ€ivitada neid isoleeritud keskkonnas, mida nimetatakse konteineriks. TĂ€nu isoleerimisele saab samaaegselt kĂ€ivitada palju konteinerite ĂŒhel serveril. Konteinerid on oluliselt kergemad kui virtuaalsed masinad, kuna need töötavad otse sĂŒsteemi tuumal. Et kĂ€ivitada konteinerit meie rakendusega, peame esmalt looma pildi, kuhu pakime kĂ”ik, mis meie rakenduse töötamiseks vajalik. Sisuliselt on pilt - see on failisĂŒsteemi koopia. NĂ€iteks vĂ”tame Dockerfile:

FROM node:12.16.2
WORKDIR /app
COPY . .
RUN npm ci
RUN npm run build --prod

Dockerfile — see on juhiste kogum; iga juhise tĂ€itmisega salvestab Docker muudatused failisĂŒsteemis ja rakendab neid eelnevatele. Iga kĂ€sk loob oma kihi. Valmis pilt on koositatud kihtidest.

Oluline teada: iga kiht on Dockeris vahemÀllu salvestatav. Kui viimase koostamisega ei ole midagi muutunud, siis vÔtab Docker kÀsku tÀitmata juba valmis kihi. Kuna peamine kiirusetÔus koostamisel tuleb vahemÀlu kasutamisest, siis keskendume kiirusemÔÔtmiste ajal just pildi koostamisele valmis vahemÀluga. Nii et jÀrgime samme:

  1. Kustutame kohalikud pildid, et eelnevad kÀivitamised ei mÔjutaks testi.
    docker rmi $(docker images -q)
  2. KĂ€ivitame ehituse esmakordselt.
    time docker build -t app .
  3. Muudame faili src/index.html — simuleerime programmeerija tööd.
  4. KĂ€ivitame ehituse teist korda.
    time docker build -t app .

Kui pildikogumise keskkond on Ă”igesti seadistatud (millest rÀÀgime veidi allpool), siis Dockeril on pildikoostamise kĂ€ivitamisel juba olemas hulk vahemĂ€lu. Meie eesmĂ€rk on Ă”ppida, kuidas vahemĂ€lu kasutada nii, et koostamine toimuks vĂ”imalikult kiiresti. Oletame, et koostamise kĂ€ivitamine ilma vahemĂ€luta toimub ainult ĂŒks kord — esmakordselt — seega saame ignoreerida, kui aeglane oli see esimene kord. Testides on meie jaoks oluliseks teiseks koostamiseks, kui vahemĂ€lud on juba soojendatud ja oleme valmis kĂŒpsetama oma kooki. Sellegipoolest mĂ”ningad nĂ€punĂ€ited mĂ”jutavad ka esimest koostamist.

Asetame ĂŒlaltoodud Dockerfile projekti kausta ja kĂ€ivitame koostamise. KĂ”ik esitatud loetelud on mugavuse huvides lĂŒhendatud.

$ time docker build -t app .
Saadan ehituskonteksti Docker daemonile 409MB
Samm 1/5 : FROM node:12.16.2
Olek: Laaditud uuem pilt node:12.16.2
Samm 2/5 : WORKDIR /app
Samm 3/5 : COPY . .
Samm 4/5 : RUN npm ci
lisa 1357 paketti 22.47s
Samm 5/5 : RUN npm run build --prod
KuupÀev: 2020-04-16T19:20:09.664Z - Hash: fffa0fddaa3425c55dd3 - Aeg: 37581ms
Edukas koostamine: c8c279335f46
Edukas mÀrgistamine: app:latest

reaalne 5m4.541s
kasutaja 0m0.000s
sĂŒsteem 0m0.000s

Muudame sisu src/index.html ja kÀivitame teist korda.

$ time docker build -t app .
Sending build context to Docker daemon 409MB
Step 1/5 : FROM node:12.16.2
Step 2/5 : WORKDIR /app
 --- > Using cache
Step 3/5 : COPY . .
Step 4/5 : RUN npm ci
added 1357 packages in 22.47s
Step 5/5 : RUN npm run build --prod
Date: 2020-04-16T19:26:26.587Z - Hash: fffa0fddaa3425c55dd3 - Time: 37902ms
Successfully built 79f335df92d3
Successfully tagged app:latest

real 3m33.262s
user 0m0.000s
sys 0m0.000s

Vaadates, kas meie pilt on valmis, kÀivitame kÀsu docker images:

REPOSITORY   TAG      IMAGE ID       CREATED              SIZE
app          latest   79f335df92d3   About a minute ago   1.74GB

Enne koostamist kogub docker kĂ”ik failid praegusest kontekstist ja saadab need oma deemonile Sending build context to Docker daemon 409MB. Koostamiskontekst mÀÀratakse kĂ€skluse build viimaseks argumendiks. Meie puhul on see praegune kataloog — «.», — ja docker toob kĂ”ik, mis meil selles kaustas on. 409 MB on palju: mĂ”elgem, kuidas seda parandada.

Konteksti vÀhendamine

Konteksti vÀhendamiseks on kaks vÔimalust. Kas panna kÔik koostamiseks vajalikud failid eraldi kausta ja nÀidata dockerile konteksti just sellele kaustale. See ei pruugi alati mugav olla, seega on vÔimalik nÀidata erandeid: mida ei peaks konteksti tooma. Selleks paneme projekti faili .dockerignore ja nÀitame, mis ei ole koostamiseks vajalik:

.git
/node_modules

ja kÀivitame koostamise uuesti:

$ time docker build -t app .
Sending build context to Docker daemon 607.2kB
Step 1/5 : FROM node:12.16.2
Step 2/5 : WORKDIR /app
 ---> Using cache
Step 3/5 : COPY . .
Step 4/5 : RUN npm ci
added 1357 packages in 22.47s
Step 5/5 : RUN npm run build --prod
Date: 2020-04-16T19:33:54.338Z - Hash: fffa0fddaa3425c55dd3 - Time: 37313ms
Successfully built 4942f010792a
Successfully tagged app:latest

real 1m47.763s
user 0m0.000s
sys 0m0.000s

607.2 KB — palju parem kui 409 MB. Samuti vĂ€hendasime pildi suurust 1.74 GB-lt 1.38 GB-le:

REPOSITORY   TAG      IMAGE ID       CREATED         SIZE
app          latest   4942f010792a   3 minutes ago   1.38GB

Katsume veel pildi suurust vÀhendada.

Kasutame Alpine'i

Veel ĂŒks viis pildi suuruse kokkuhoiuks on kasutada vĂ€ikest vanemapilti. Vanemapilt on see pilt, mille pĂ”hjal meie pilt valmistatakse. Alumine kiht mÀÀratakse kĂ€suga FROM Dockerfile'is. Meie puhul kasutame Ubuntu-pĂ”hist pilti, kus on juba nodejs. Ja selle kaal on 


$ docker images -a | grep node
node 12.16.2 406aa3abbc6c 17 minutes ago 916MB


 peaaegu gigabait. Mahtu saab tunduvalt vÀhendada, kasutades Alpine Linux-pÔhist pilti. Alpine on vÀga vÀike Linux. Nodejs-i Docker-pilt, mis pÔhineb Alpine'il, kaalub ainult 88.5 MB. SeetÔttu asendame meie suure pildi:

MUUTU node:12.16.2-alpine3.11
RUN apk --no-cache --update --virtual build-dependencies add 
    python 
    make 
    g++
WORKDIR /app
COPY . .
RUN npm ci
RUN npm run build --prod

Pidime paigaldama mÔned asjad, mis on vajalikud rakenduse ehitamiseks. Jah, Angular ei ehita ilma Pythonita ¯(°_o)/¯

Aga pildi suurus vÀhenes 150 MB vÔrra:

REPOSITORY   TAG      IMAGE ID       CREATED          SIZE
app          latest   aa031edc315a   22 minutes ago   761MB

Liigume veel edasi.

Mitme etapi ehitus

KÔik, mis pildis on, pole meile tootmises vajalik.

$ docker run app ls -lah
total 576K
drwxr-xr-x 1 root root 4.0K Apr 16 19:54 .
drwxr-xr-x 1 root root 4.0K Apr 16 20:00 ..
-rwxr-xr-x 1 root root 19 Apr 17 2020 .dockerignore
-rwxr-xr-x 1 root root 246 Apr 17 2020 .editorconfig
-rwxr-xr-x 1 root root 631 Apr 17 2020 .gitignore
-rwxr-xr-x 1 root root 181 Apr 17 2020 Dockerfile
-rwxr-xr-x 1 root root 1020 Apr 17 2020 README.md
-rwxr-xr-x 1 root root 3.6K Apr 17 2020 angular.json
-rwxr-xr-x 1 root root 429 Apr 17 2020 browserslist
drwxr-xr-x 3 root root 4.0K Apr 16 19:54 dist
drwxr-xr-x 3 root root 4.0K Apr 17 2020 e2e
-rwxr-xr-x 1 root root 1015 Apr 17 2020 karma.conf.js
-rwxr-xr-x 1 root root 620 Apr 17 2020 ngsw-config.json
drwxr-xr-x 1 root root 4.0K Apr 16 19:54 node_modules
-rwxr-xr-x 1 root root 494.9K Apr 17 2020 package-lock.json
-rwxr-xr-x 1 root root 1.3K Apr 17 2020 package.json
drwxr-xr-x 5 root root 4.0K Apr 17 2020 src
-rwxr-xr-x 1 root root 210 Apr 17 2020 tsconfig.app.json
-rwxr-xr-x 1 root root 489 Apr 17 2020 tsconfig.json
-rwxr-xr-x 1 root root 270 Apr 17 2020 tsconfig.spec.json
-rwxr-xr-x 1 root root 1.9K Apr 17 2020 tslint.json

KÀesoleva abil docker run app ls -lah me kÀivitasime konteineri meie pildilt app ja tÀitsime seal kÀsu ls -lah, pÀrast mida konteiner lÔpetas oma tööd.

Tootmises vajame ainult kausta dist. Samal ajal on faile kuidagi vaja vĂ€lja anda. Saame kĂ€ivitada mingisuguse HTTP-serveri nodejs-is. Aga teeme lihtsamalt. Arva Ă€ra vene sĂ”na, milles on neli tĂ€hte "ы". Õige! Đ«ĐœĐ¶Ń‹ĐœŃ‹Đșсы. VĂ”tame nginx'i pildi, paneme sinna kausta dist ja vĂ€ikese konfiguratsiooni:

server {
    listen 80 default_server;
    server_name localhost;
    charset utf-8;
    root /app/dist;

    location / {
        try_files $uri $uri/ /index.html;
    }
}

Selle kÔikide tegemiseks aitab meid multi-stage build. Muudame meie Dockerfile'i:

FROM node:12.16.2-alpine3.11 as builder
RUN apk --no-cache --update --virtual build-dependencies add 
    python 
    make 
    g++
WORKDIR /app
COPY . .
RUN npm ci
RUN npm run build --prod

FROM nginx:1.17.10-alpine
RUN rm /etc/nginx/conf.d/default.conf
COPY nginx/static.conf /etc/nginx/conf.d
COPY --from=builder /app/dist/app .

NĂŒĂŒd on meil kaks kĂ€sklust FROM Dockerfile'is, millest igaĂŒks kĂ€ivitab oma ehitusetapi. Esimesele andsime nime builder, ja alates viimasest FROM-ist hakatakse meie lĂ”plikku pilti ette valmistama. Viimase sammuna kopeerime meie eelneva etapi ehitusartefakti lĂ”pp- tagasi nginx-i. Pildi suurus on oluliselt vĂ€henenud:

REPOSITORY   TAG      IMAGE ID       CREATED          SIZE
app          latest   2c6c5da07802   29 minutes ago   36MB

KÀivitame konteineri meie pildiga ja veendume, et kÔik töötab:

docker run -p8080:80 app

Argument -p8080:80 suunab meie hostmasinas 8080 pordi 80 porti konteineris, kus töötab nginx. Avame brauseris http://localhost:8080/ ja nÀeme meie rakendust. KÔik töötab!

MÔned nÔuanded, kuidas kiirendada Docker-piltide koostamist. NÀiteks kuni 30 sekundit

Pildi suuruse vĂ€hendamine 1.74 GB-st 36 MB-ni lĂŒhendab oluliselt teie rakenduse tootmisesse toimetamise aega. Kuid naaseme ehitusaega.

$ time docker build -t app .
Sending build context to Docker daemon 608.8kB
Step 1/11 : FROM node:12.16.2-alpine3.11 as builder
Step 2/11 : RUN apk --no-cache --update --virtual build-dependencies add python make g++
 ---> Using cache
Step 3/11 : WORKDIR /app
 ---> Using cache
Step 4/11 : COPY . .
Step 5/11 : RUN npm ci
added 1357 packages in 47.338s
Step 6/11 : RUN npm run build --prod
Date: 2020-04-16T21:16:03.899Z - Hash: fffa0fddaa3425c55dd3 - Time: 39948ms
 ---> 27f1479221e4
Step 7/11 : FROM nginx:stable-alpine
Step 8/11 : WORKDIR /app
 ---> Using cache
Step 9/11 : RUN rm /etc/nginx/conf.d/default.conf
 ---> Using cache
Step 10/11 : COPY nginx/static.conf /etc/nginx/conf.d
 ---> Using cache
Step 11/11 : COPY --from=builder /app/dist/app .
Successfully built d201471c91ad
Successfully tagged app:latest

real 2m17.700s
user 0m0.000s
sys 0m0.000s

Muudame kihtide jÀrjekorda

Esimesed kolm sammu olid meil vahemĂ€lus (vihje Using cache). Neljandas etapis kopeeritakse kĂ”ik projekti failid ja viiendas etapis paigaldatakse sĂ”ltuvused RUN npm ci — kokku 47,338 s. Miks paigaldada sĂ”ltuvused iga kord uuesti, kui need muutuvad vĂ€ga harva? Vaatame, miks nad ei ole vahemĂ€lusse salvestatud. Asi on selles, et Docker kontrollib kiht kihi haaval, kas kĂ€sk ja sellega seotud failid on muutunud. Neljandas sammus kopeerime kĂ”ik meie projekti failid ja nende seas on loomulikult muudatused, mistĂ”ttu Docker ei kasuta mitte ainult seda kihti vahemĂ€lust, vaid kĂ”iki jĂ€rgmisi! Teeme Dockerfile'is vĂ€iksed muudatused.

FROM node:12.16.2-alpine3.11 as builder
RUN apk --no-cache --update --virtual build-dependencies add 
    python 
    make 
    g++
WORKDIR /app
COPY package*.json ./
RUN npm ci
COPY . .
RUN npm run build --prod

FROM nginx:1.17.10-alpine
RUN rm /etc/nginx/conf.d/default.conf
COPY nginx/static.conf /etc/nginx/conf.d
COPY --from=builder /app/dist/app .

Esmalt kopeeritakse package.json ja package-lock.json, seejÀrel paigaldatakse sÔltuvused ja alles pÀrast seda kopeeritakse kogu projekt. Tulemuseks:

$ time docker build -t app .
Sending build context to Docker daemon 608.8kB
Step 1/12 : FROM node:12.16.2-alpine3.11 as builder
Step 2/12 : RUN apk --no-cache --update --virtual build-dependencies add python make g++
 ---> Using cache
Step 3/12 : WORKDIR /app
 ---> Using cache
Step 4/12 : COPY package*.json ./
 ---> Using cache
Step 5/12 : RUN npm ci
 ---> Using cache
Step 6/12 : COPY . .
Step 7/12 : RUN npm run build --prod
Date: 2020-04-16T21:29:44.770Z - Hash: fffa0fddaa3425c55dd3 - Time: 38287ms
 ---> 1b9448c73558
Step 8/12 : FROM nginx:stable-alpine
Step 9/12 : WORKDIR /app
 ---> Using cache
Step 10/12 : RUN rm /etc/nginx/conf.d/default.conf
 ---> Using cache
Step 11/12 : COPY nginx/static.conf /etc/nginx/conf.d
 ---> Using cache
Step 12/12 : COPY --from=builder /app/dist/app .
Successfully built a44dd7c217c3
Successfully tagged app:latest

real 0m46.497s
user 0m0.000s
sys 0m0.000s

46 sekundit kolme minuti asemel — oluliselt parem! Oluline on kihtide Ă”ige jĂ€rjekord: esmalt kopeerime selle, mis ei muutu, seejĂ€rel selle, mis harva muutub, ja lĂ”puks — selle, mis sageli.

JĂ€tkame natuke juttu pildihaldusest CI/CD sĂŒsteemides.

Eelmiste piltide kasutamine vahehoiuna

Kui me kasutame mingit SaaS-lahendust ehitamiseks, siis vĂ”ib kohalik Docker'i vahehoidla olla puhas ja vĂ€rske. Et Docker'il oleks kust vĂ”tta kĂŒpsetatud kihte, andke talle eelnevalt kokku pandud pilt.

Vaatame nÀiteks meie rakenduse ehitamist GitHub Actionsis. Kasutame sellist konfi

kas:
  push:
    branches:
      - master

name: Test docker build

jobs:
  deploy:
    name: Build
    runs-on: ubuntu-latest
    env:
      IMAGE_NAME: docker.pkg.github.com/${{ github.repository }}/app
      IMAGE_TAG: ${{ github.sha }}

    steps:
    - name: Checkout
      uses: actions/checkout@v2

    - name: Login to GitHub Packages
      env:
        TOKEN: ${{ secrets.GITHUB_TOKEN }}
      run: |
        docker login docker.pkg.github.com -u $GITHUB_ACTOR -p $TOKEN

    - name: Build
      run: |
        docker build 
          -t $IMAGE_NAME:$IMAGE_TAG 
          -t $IMAGE_NAME:latest 
          .

    - name: Push image to GitHub Packages
      run: |
        docker push $IMAGE_NAME:latest
        docker push $IMAGE_NAME:$IMAGE_TAG

    - name: Logout
      run: |
        docker logout docker.pkg.github.com

Pilt kogutakse ja saadetakse GitHub Packagesi kahe minuti ja 20 sekundi jooksul:

MÔned nÔuanded, kuidas kiirendada Docker-piltide koostamist. NÀiteks kuni 30 sekundit

NĂŒĂŒd muudame kogumise nii, et kasutame varasemate kogutud piltide pĂ”hjal vahemĂ€lu:

on:
  push:
    branches:
      - master

name: Test docker build

jobs:
  deploy:
    name: Build
    runs-on: ubuntu-latest
    env:
      IMAGE_NAME: docker.pkg.github.com/${{ github.repository }}/app
      IMAGE_TAG: ${{ github.sha }}

    steps:
    - name: Checkout
      uses: actions/checkout@v2

    - name: Login to GitHub Packages
      env:
        TOKEN: ${{ secrets.GITHUB_TOKEN }}
      run: |
        docker login docker.pkg.github.com -u $GITHUB_ACTOR -p $TOKEN

    - name: Pull latest images
      run: |
        docker pull $IMAGE_NAME:latest || true
        docker pull $IMAGE_NAME-builder-stage:latest || true

    - name: Images list
      run: |
        docker images

    - name: Build
      run: |
        docker build 
          --target builder 
          --cache-from $IMAGE_NAME-builder-stage:latest 
          -t $IMAGE_NAME-builder-stage 
          .
        docker build 
          --cache-from $IMAGE_NAME-builder-stage:latest 
          --cache-from $IMAGE_NAME:latest 
          -t $IMAGE_NAME:$IMAGE_TAG 
          -t $IMAGE_NAME:latest 
          .

    - name: Push image to GitHub Packages
      run: |
        docker push $IMAGE_NAME-builder-stage:latest
        docker push $IMAGE_NAME:latest
        docker push $IMAGE_NAME:$IMAGE_TAG

    - name: Logout
      run: |
        docker logout docker.pkg.github.com

Esiteks on vaja rÀÀkida, miks kÀivitatakse kaks kÀsku build. Probleem on selles, et mitmeetapise ehituse tulemusena on komplekt kihte viimasest etapist. Eelmiste kihtide kihid ei jÔua pildile. Seega, kui kasutada viimast pilti eelmisest ehitusest, ei suuda Docker leida valmis kihte nodejs pildi (ehitusetapp builder) koostamiseks. Selle probleemi lahendamiseks luuakse vahepilt $IMAGE_NAME-builder-stage ja saadetakse GitHub Packages'i, et seda saaks kasutada jÀrgmises ehituses vahekaustana.

MÔned nÔuanded, kuidas kiirendada Docker-piltide koostamist. NÀiteks kuni 30 sekundit

Üldine ehitusaeg on lĂŒhenenud ĂŒhe ja poole minutini. Pool minutit kulub eelmiste piltide tĂ”mbamiseks.

Piltide eelneva loomine

Veel ĂŒks viis Docker'i puhta vahecache probleemi lahendamiseks on osa kihtidest vĂ€lja viia teise Dockerfile'i, ehitada see eraldi, pushida Container Registry'sse ja kasutada vanemana.

Loome oma nodejs pildi Angular rakenduse koostamiseks. Loome projektis Dockerfile.node

FROM node:12.16.2-alpine3.11
RUN apk --no-cache --update --virtual build-dependencies add 
    python 
    make 
    g++

Kogume ja pushime avaliku pildi Docker Hubi:

docker build -t exsmund/node-for-angular -f Dockerfile.node .
docker push exsmund/node-for-angular:latest

NĂŒĂŒd kasutame oma pĂ”hijuhendis valmis pilti:

FROM exsmund/node-for-angular:latest as builder
...

Meie nĂ€ites ei lĂŒhenenud ehitusaeg, kuid eelnevalt loodud pildid vĂ”ivad olla kasulikud, kui teil on palju projekte, milles peate installima samu sĂ”ltuvusi.

MÔned nÔuanded, kuidas kiirendada Docker-piltide koostamist. NÀiteks kuni 30 sekundit

Olemegi kÀsitlenud mitmeid meetodeid Docker-piltide ehitamise kiirendamiseks. Kui soovite kiirusest lugu pidada, proovige oma projektis rakendada:

  • konteksti vĂ€hendamine;
  • vĂ€ikeste vanemapiltide kasutamine;
  • multi-stage ehitus;
  • Dockerfile'i kĂ€skude jĂ€rjestuse muutmine koodi efektiivseks kasutamiseks;
  • CI/CD sĂŒsteemides cache’i seadistamine;
  • piltide eelnev loomine.

Loodan, et nÀidisest saab selgemaks, kuidas Docker töötab, ja et suudate oma seadistusi optimaalselt kohandada. Artikli nÀidistega mÀngimiseks on loodud hoidla. https://github.com/devopsprodigy/test-docker-build.

Allikas: habr.com

Osta usaldusvÀÀrne veebihosting DDoS kaitsega, VPS VDS serverid đŸ”„ Osta usaldusvÀÀrne veebihosting DDoS kaitsega, VPS VDS serverid | ProHoster