Pipila ka mga tip kung giunsa pagpadali ang paghimo sa mga imahe sa Docker. Pananglitan, hangtod sa 30 segundos

Sa wala pa ang usa ka bahin mosulod sa produksiyon, niining mga adlaw sa komplikadong mga orkestra ug CI/CD, adunay taas nga paagi gikan sa pagpasalig ngadto sa pagsulay ug paghatud. Kaniadto, mahimo nimong i-upload ang mga bag-ong file pinaagi sa FTP (wala nay naghimo niana, di ba?), Ug ang proseso sa "pag-deploy" milungtad mga segundo. Karon kinahanglan nimo nga maghimo usa ka hangyo sa paghiusa ug maghulat og dugay nga panahon aron maabot ang bahin sa mga tiggamit.

Kabahin sa kini nga agianan mao ang paghimo usa ka imahe sa Docker. Usahay ang asembliya molungtad sa mga minuto, usahay napulo ka minuto, nga halos dili matawag nga normal. Niini nga artikulo, magkuha kami usa ka yano nga aplikasyon nga among i-package sa usa ka imahe, magamit ang daghang mga pamaagi aron mapadali ang pagtukod, ug tan-awon ang mga nuances kung giunsa kini nga mga pamaagi molihok.

Pipila ka mga tip kung giunsa pagpadali ang paghimo sa mga imahe sa Docker. Pananglitan, hangtod sa 30 segundos

Kami adunay maayo nga kasinatian sa paghimo ug pagsuporta sa mga website sa media: TASS, Ang Bell, "Bag-ong Pamantalaan", Republic… Dili pa lang dugay among gipalapdan ang among portfolio pinaagi sa pagpagawas sa usa ka website sa produkto Pahinumdum. Ug samtang ang bag-ong mga bahin dali nga gidugang ug ang daan nga mga bug giayo, ang hinay nga pag-deploy nahimong usa ka dako nga problema.

Nag-deploy kami sa GitLab. Gikolekta namo ang mga hulagway, iduso kini sa GitLab Registry ug i-roll kini ngadto sa produksyon. Ang pinakataas nga butang sa kini nga lista mao ang pag-assemble sa mga imahe. Pananglitan: kung wala’y pag-optimize, ang matag backend nga pagtukod gikuha 14 minuto.

Pipila ka mga tip kung giunsa pagpadali ang paghimo sa mga imahe sa Docker. Pananglitan, hangtod sa 30 segundos

Sa katapusan, nahimong tin-aw nga dili na kami mabuhi nga ingon niini, ug kami nanglingkod aron mahibal-an kung ngano nga ang mga imahe nagdugay sa pagkolekta. Ingong resulta, among napakunhod ang oras sa asembliya ngadto sa 30 segundos!

Pipila ka mga tip kung giunsa pagpadali ang paghimo sa mga imahe sa Docker. Pananglitan, hangtod sa 30 segundos

Alang sa kini nga artikulo, aron dili mahigot sa palibot sa Pahinumdom, atong tan-awon ang usa ka pananglitan sa pag-assemble sa usa ka walay sulod nga Angular nga aplikasyon. Busa, maghimo kita sa atong aplikasyon:

ng n app

Gidugang namo ang PWA niini (progresibo kami):

ng add @angular/pwa --project app

Samtang usa ka milyon nga npm nga mga pakete ang gi-download, atong mahibal-an kung giunsa ang paglihok sa imahe sa docker. Naghatag ang Docker og katakus sa pag-package sa mga aplikasyon ug pagpadagan niini sa usa ka hilit nga palibot nga gitawag nga sudlanan. Salamat sa pagkahimulag, mahimo nimong ipadagan ang daghang mga sudlanan nga dungan sa usa ka server. Ang mga sudlanan labi ka gaan kaysa virtual nga mga makina tungod kay direkta kini nga nagdagan sa kernel sa sistema. Aron makadagan ang usa ka sudlanan sa among aplikasyon, kinahanglan una namon nga maghimo usa ka imahe diin among i-package ang tanan nga kinahanglan aron madagan ang among aplikasyon. Sa tinuud, ang usa ka imahe usa ka kopya sa file system. Pananglitan, kuhaa ang Dockerfile:

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

Ang Dockerfile usa ka hugpong sa mga instruksyon; Pinaagi sa pagbuhat sa matag usa niini, i-save ni Docker ang mga pagbag-o sa file system ug i-overlay kini sa mga nauna. Ang matag team naghimo sa kaugalingon nga layer. Ug ang nahuman nga imahe mga lut-od nga gihiusa.

Unsa ang importante nga mahibal-an: ang matag layer sa Docker mahimong mag-cache. Kung wala’y nabag-o sukad sa katapusan nga pagtukod, unya imbis nga ipatuman ang mando, ang docker magkuha usa ka andam nga layer. Tungod kay ang nag-unang pag-uswag sa katulin sa pagtukod tungod sa paggamit sa cache, kung gisukod ang katulin sa pagtukod hatagan namon ang pagtagad ilabi na sa pagtukod og usa ka imahe nga adunay andam nga cache. Busa, lakang sa lakang:

  1. Atong tangtangon ang mga imahe sa lokal aron ang mga nangaging pagdagan dili makaapekto sa pagsulay.
    docker rmi $(docker images -q)
  2. Gilunsad namo ang pagtukod sa unang higayon.
    time docker build -t app .
  3. Atong usbon ang src/index.html file - atong gisundog ang buhat sa usa ka programmer.
  4. Gipadagan namo ang pagtukod sa ikaduhang higayon.
    time docker build -t app .

Kung ang palibot alang sa pagtukod og mga imahe gi-configure sa husto (labaw pa sa ubos), unya kung magsugod ang pagtukod, ang Docker adunay daghang mga cache nga sakay. Ang among tahas mao ang pagkat-on kung giunsa paggamit ang cache aron ang pagtukod moadto sa labing madali. Tungod kay nagtuo kami nga ang pagpadagan sa usa ka pagtukod nga wala’y cache usa ra ka higayon nga mahitabo - sa una nga higayon - mahimo naton ibaliwala kung unsa ka hinay ang una nga higayon. Sa mga pagsulay, ang ikaduha nga pagdagan sa pagtukod hinungdanon alang kanamo, kung ang mga cache gipainit na ug andam na kami nga magluto sa among cake. Bisan pa, ang pipila ka mga tip makaapekto usab sa una nga pagtukod.

Atong ibutang ang Dockerfile nga gihulagway sa ibabaw sa project folder ug sugdi ang pagtukod. Ang tanan nga mga lista gipamubu alang sa kadali sa pagbasa.

$ time docker build -t app .
Sending build context to Docker daemon 409MB
Step 1/5 : FROM node:12.16.2
Status: Downloaded newer image for node:12.16.2
Step 2/5 : WORKDIR /app
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:20:09.664Z - Hash: fffa0fddaa3425c55dd3 - Time: 37581ms
Successfully built c8c279335f46
Successfully tagged app:latest

real 5m4.541s
user 0m0.000s
sys 0m0.000s

Atong usbon ang sulod sa src/index.html ug ipadagan kini sa ikaduhang higayon.

$ 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

Aron mahibal-an kung kami adunay imahe, padagana ang mando docker images:

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

Sa wala pa magtukod, gikuha sa docker ang tanan nga mga file sa karon nga konteksto ug ipadala kini sa daemon niini Sending build context to Docker daemon 409MB. Ang konteksto sa pagtukod gipiho isip katapusang argumento sa command sa pagtukod. Sa among kaso, kini ang kasamtangan nga direktoryo - ".", - ug gi-drag ni Docker ang tanan nga naa sa kini nga folder. Daghan ang 409 MB: atong hunahunaon kon unsaon kini pag-ayo.

Pagkunhod sa konteksto

Aron makunhuran ang konteksto, adunay duha ka kapilian. O ibutang ang tanan nga mga file nga gikinahanglan alang sa asembliya sa usa ka bulag nga folder ug itudlo ang konteksto sa docker sa kini nga folder. Mahimong dili kini kanunay nga kombenyente, mao nga posible nga ipiho ang mga eksepsiyon: kung unsa ang dili kinahanglan i-drag sa konteksto. Aron mahimo kini, ibutang ang .dockerignore nga file sa proyekto ug ipakita kung unsa ang dili kinahanglan alang sa pagtukod:

.git
/node_modules

ug padagana pag-usab ang pagtukod:

$ 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

Ang 607.2 KB mas maayo kay sa 409 MB. Gikunhoran usab namo ang gidak-on sa hulagway gikan sa 1.74 ngadto sa 1.38 GB:

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

Atong sulayan nga pakunhuran pa ang gidak-on sa imahe.

Gigamit namon ang Alpine

Ang laing paagi aron makadaginot sa gidak-on sa hulagway mao ang paggamit og gamay nga hulagway sa ginikanan. Ang imahe sa ginikanan mao ang imahe nga gibase sa kung diin giandam ang among imahe. Ang ubos nga layer gipiho sa command FROM sa Dockerfile. Sa among kaso, naggamit kami usa ka imahe nga nakabase sa Ubuntu nga na-install na ang mga nodej. Ug kini nagtimbang ...

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

... hapit usa ka gigabyte. Mahimo nimong makunhuran ang gidaghanon pinaagi sa paggamit sa usa ka imahe nga gibase sa Alpine Linux. Ang Alpine kay gamay ra kaayo nga Linux. Ang imahe sa docker alang sa mga nodej nga gibase sa alpine nagtimbang lamang sa 88.5 MB. Busa atong ilisan ang atong buhi nga imahe sa mga balay:

FROM 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

Kinahanglan namon nga i-install ang pipila ka mga butang nga kinahanglan aron matukod ang aplikasyon. Oo, ang Angular dili magtukod kung wala ang Python Β―(Β°_o)/Β―

Apan ang gidak-on sa imahe nahulog sa 150 MB:

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

Magpadayon pa ta.

Multistage nga asembliya

Dili tanan nga naa sa imahe ang kinahanglan naton sa produksiyon.

$ 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

Uban sa tabang sa docker run app ls -lah naglunsad kami og sudlanan base sa among hulagway app ug gituman ang sugo niini ls -lah, nga human niana ang sudlanan nakompleto ang trabaho niini.

Sa produksiyon kinahanglan ra namon ang usa ka folder dist. Sa kini nga kaso, ang mga file sa usa ka paagi kinahanglan nga ihatag sa gawas. Mahimo nimong ipadagan ang pipila ka HTTP server sa mga nodej. Apan atong himoon nga mas sayon. Tag-ana ang pulong nga Ruso nga adunay upat ka letra nga "y". Husto! Ynzhynyksy. Magkuha ta ug image nga naay nginx, butangan ug folder dist ug gamay nga config:

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

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

Ang multi-stage nga pagtukod makatabang kanato sa pagbuhat niining tanan. Usbon nato ang atong Dockerfile:

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 .

Karon kami adunay duha ka mga panudlo FROM sa Dockerfile, ang matag usa kanila nagpadagan sa lainlaing lakang sa pagtukod. Gitawag namo ang una builder, apan sugod sa kataposang GIKAN, ang atong kataposang hulagway maandam na. Ang katapusang lakang mao ang pagkopya sa artifact sa among asembliya sa miaging yugto ngadto sa katapusang imahe nga adunay nginx. Ang gidak-on sa imahe mikunhod pag-ayo:

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

Atong daganon ang sudlanan gamit ang atong imahe ug siguruha nga ang tanan molihok:

docker run -p8080:80 app

Gamit ang -p8080:80 nga kapilian, gipasa namo ang port 8080 sa among host machine ngadto sa port 80 sulod sa sudlanan diin ang nginx midagan. Ablihi sa browser http://localhost:8080/ ug atong makita ang atong aplikasyon. Ang tanan nagtrabaho!

Pipila ka mga tip kung giunsa pagpadali ang paghimo sa mga imahe sa Docker. Pananglitan, hangtod sa 30 segundos

Ang pagkunhod sa gidak-on sa imahe gikan sa 1.74 GB hangtod sa 36 MB labi nga nagpamenos sa oras nga gikinahanglan aron mahatud ang imong aplikasyon sa produksiyon. Pero balik ta sa panahon sa asembliya.

$ 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

Pag-usab sa han-ay sa mga lut-od

Ang among unang tulo ka mga lakang gi-cache (hint Using cache). Sa ikaupat nga lakang, ang tanan nga mga file sa proyekto gikopya ug sa ikalimang lakang ang mga dependency gi-install RUN npm ci - kutob sa 47.338 ka s. Ngano nga i-install pag-usab ang mga dependency matag higayon kung kini panagsa ra magbag-o? Atong mahibal-an kung nganong wala sila gi-cache. Ang punto mao nga ang Docker magsusi sa layer sa layer aron makita kung ang command ug ang mga file nga may kalabutan niini nausab. Sa ikaupat nga lakang, gikopya namo ang tanan nga mga file sa among proyekto, ug lakip niini, siyempre, adunay mga pagbag-o, mao nga ang Docker dili lamang mokuha niini nga layer gikan sa cache, kondili usab sa tanan nga nagsunod! Himoon nato ang pipila ka gagmay nga mga pagbag-o sa Dockerfile.

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 .

Una, ang package.json ug package-lock.json gikopya, dayon ang mga dependency gi-install, ug pagkahuman lang nga ang tibuok proyekto makopya. Isip resulta:

$ 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 segundos imbes 3 minuto - mas maayo! Ang husto nga han-ay sa mga lut-od importante: una atong kopyahon ang dili mausab, unya unsa ang panagsa ra mausab, ug sa katapusan unsa ang kanunay nga mausab.

Sunod, pipila ka mga pulong bahin sa pag-assemble sa mga imahe sa mga sistema sa CI / CD.

Paggamit sa miaging mga imahe alang sa cache

Kung mogamit kami usa ka matang sa solusyon sa SaaS alang sa pagtukod, nan ang lokal nga cache sa Docker mahimong limpyo ug presko. Aron mahatagan ang pantalan sa usa ka lugar aron makuha ang mga linuto nga layer, hatagi siya sa miaging gitukod nga imahe.

Atong kuhaon ang usa ka pananglitan sa pagtukod sa atong aplikasyon sa GitHub Actions. Gigamit namo kini nga config

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: 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

Ang imahe gitigum ug giduso sa GitHub Packages sa duha ka minuto ug 20 segundos:

Pipila ka mga tip kung giunsa pagpadali ang paghimo sa mga imahe sa Docker. Pananglitan, hangtod sa 30 segundos

Karon atong usbon ang pagtukod aron ang usa ka cache gigamit base sa nauna nga gitukod nga mga imahe:

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

Una kinahanglan namon isulti kanimo kung nganong gilunsad ang duha ka mga sugo build. Ang kamatuoran mao nga sa usa ka multistage nga asembliya ang resulta nga hulagway mahimong usa ka hugpong sa mga lut-od gikan sa katapusang yugto. Sa kini nga kaso, ang mga layer gikan sa miaging mga layer dili iapil sa imahe. Busa, kung gamiton ang katapusan nga imahe gikan sa usa ka miaging pagtukod, ang Docker dili makit-an nga andam nga mga layer aron matukod ang imahe gamit ang mga nodejs (stage sa builder). Aron masulbad kini nga problema, usa ka intermediate nga imahe ang gihimo $IMAGE_NAME-builder-stage ug giduso ngadto sa GitHub Packages aron kini magamit sa sunod nga pagtukod isip tinubdan sa cache.

Pipila ka mga tip kung giunsa pagpadali ang paghimo sa mga imahe sa Docker. Pananglitan, hangtod sa 30 segundos

Ang kinatibuk-ang oras sa asembliya gipamub-an ngadto sa usa ug tunga ka minuto. Katunga sa minuto ang gigugol sa pagbira sa nangaging mga hulagway.

Preimaging

Ang laing paagi sa pagsulbad sa problema sa usa ka limpyo nga Docker cache mao ang pagbalhin sa pipila ka mga layer ngadto sa laing Dockerfile, paghimo niini nga gilain, iduso kini ngadto sa Container Registry ug gamiton kini isip usa ka ginikanan.

Naghimo kami sa among kaugalingon nga imahe sa nodejs aron makahimo usa ka aplikasyon sa Angular. Paghimo Dockerfile.node sa proyekto

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

Kami nagkolekta ug nagduso sa usa ka publiko nga imahe sa Docker Hub:

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

Karon sa among nag-unang Dockerfile among gigamit ang nahuman nga imahe:

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

Sa among pananglitan, ang oras sa pagtukod wala mokunhod, apan ang mga pre-built nga mga imahe mahimong mapuslanon kung adunay ka daghang mga proyekto ug kinahanglan nimo nga i-install ang parehas nga mga dependency sa matag usa niini.

Pipila ka mga tip kung giunsa pagpadali ang paghimo sa mga imahe sa Docker. Pananglitan, hangtod sa 30 segundos

Gitan-aw namon ang daghang mga pamaagi alang sa pagpadali sa paghimo sa mga imahe sa docker. Kung gusto nimo nga dali ang pag-deploy, sulayi gamita kini sa imong proyekto:

  • pagkunhod sa konteksto;
  • paggamit sa gagmay nga mga larawan sa ginikanan;
  • multistage nga asembliya;
  • pagbag-o sa han-ay sa mga instruksyon sa Dockerfile aron epektibong gamiton ang cache;
  • pag-set up ug cache sa CI/CD system;
  • pasiuna nga paghimo sa mga imahe.

Nanghinaut ko nga ang panig-ingnan maghimo niini nga mas tin-aw kung giunsa ang pagtrabaho sa Docker, ug mahimo nimo nga ma-configure ang imong pag-deploy. Aron makadula sa mga pananglitan gikan sa artikulo, usa ka repository ang gihimo https://github.com/devopsprodigy/test-docker-build.

Source: www.habr.com

Idugang sa usa ka comment