Amanye amathiphu okuthi ungasheshisa kanjani ukwakha izithombe ze-Docker. Isibonelo, kufika kumasekhondi angu-30

Ngaphambi kokuthi isici singene ekukhiqizweni, kulezi zinsuku zama-orchestra ayinkimbinkimbi ne-CI/CD, kunendlela ende okufanele yenziwe kusukela ekuzinikeleni kuye ekuhlolweni nasekulethweni. Ngaphambilini, ubungalayisha amafayela amasha nge-FTP (akukho muntu okwenzayo lokho, akunjalo?), futhi inqubo "yokuthunyelwa" ithathe imizuzwana. Manje udinga ukudala isicelo sokuhlanganisa futhi ulinde isikhathi eside ukuze isici sifinyelele kubasebenzisi.

Ingxenye yale ndlela yakha isithombe se-Docker. Ngezinye izikhathi umhlangano uthatha imizuzu, ngezinye izikhathi amashumi emizuzu, okungase kubizwe ngokuthi evamile. Kulesi sihloko, sizothatha isicelo esilula esizosifaka esithombeni, sisebenzise izindlela ezimbalwa zokusheshisa ukwakha, futhi sibheke ama-nuances wokuthi lezi zindlela zisebenza kanjani.

Amanye amathiphu okuthi ungasheshisa kanjani ukwakha izithombe ze-Docker. Isibonelo, kufika kumasekhondi angu-30

Sinolwazi oluhle ekwakheni nasekusekeleni amawebhusayithi emidiya: ISITOLO, I-Bell, "Iphephandaba Elisha", Republic… Esikhathini esingeside esidlule sanweba iphothifoliyo yethu ngokukhulula iwebhusayithi yomkhiqizo Isikhumbuzi. Futhi ngenkathi izici ezintsha zengezwa ngokushesha futhi iziphazamisi ezindala zalungiswa, ukuthunyelwa kancane kwaba inkinga enkulu.

Sithumela ku-GitLab. Siqoqa izithombe, siziphushele ku-GitLab Registry bese sizikhiphela ekukhiqizweni. Into ende kakhulu kulolu hlu ukuhlanganisa izithombe. Isibonelo: ngaphandle kokuthuthukisa, ukwakhiwa kwe-backend ngakunye kuthathe imizuzu eyi-14.

Amanye amathiphu okuthi ungasheshisa kanjani ukwakha izithombe ze-Docker. Isibonelo, kufika kumasekhondi angu-30

Ekugcineni, kwacaca ukuthi ngeke sisakwazi ukuphila kanje, futhi sahlala phansi sabheka ukuthi kungani izithombe zithatha isikhathi eside ukuqoqwa. Ngenxa yalokho, sakwazi ukunciphisa isikhathi somhlangano saba imizuzwana engu-30!

Amanye amathiphu okuthi ungasheshisa kanjani ukwakha izithombe ze-Docker. Isibonelo, kufika kumasekhondi angu-30

Kulesi sihloko, ukuze singaboshelwa endaweni Yesikhumbuzi, ake sibheke isibonelo sokuhlanganisa uhlelo lokusebenza lwe-Angular olungenalutho. Ngakho-ke, masidale uhlelo lwethu lokusebenza:

ng n app

Engeza i-PWA kuyo (siyathuthuka):

ng add @angular/pwa --project app

Ngenkathi kulandwa amaphakheji we-npm ayisigidi, ake sithole ukuthi isithombe se-docker sisebenza kanjani. I-Docker inikeza ikhono lokupakisha izinhlelo zokusebenza nokuziqhuba endaweni engayodwa ebizwa ngokuthi isitsha. Ngenxa yokuhlukaniswa, ungakwazi ukusebenzisa iziqukathi eziningi ngesikhathi esisodwa kuseva eyodwa. Iziqukathi zilula kakhulu kunemishini ebonakalayo ngoba zisebenza ngqo ku-kernel yesistimu. Ukuze sisebenzise isiqukathi esinohlelo lwethu lokusebenza, sidinga kuqala ukwakha isithombe lapho sizopakisha khona yonke into edingekayo ukuze uhlelo lwethu lusebenze. Empeleni, isithombe siyikhophi yesistimu yefayela. Isibonelo, thatha i-Dockerfile:

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

I-Dockerfile iyisethi yemiyalelo; Ngokwenza ngayinye yazo, i-Docker izogcina izinguquko ohlelweni lwefayela futhi iwamboze kowangaphambili. Iqembu ngalinye lakha isendlalelo salo. Futhi isithombe esiphelile siyizendlalelo ezihlanganiswe ndawonye.

Okubalulekile ukwazi: ungqimba ngalunye lwe-Docker lungagcina inqolobane. Uma kungekho lutho olushintshile kusukela ekwakhiweni kokugcina, esikhundleni sokwenza umyalo, i-docker izothatha isendlalelo esenziwe ngomumo. Njengoba ukwanda okuyinhloko kwejubane lokwakha kuzoba ngenxa yokusetshenziswa kwenqolobane, lapho silinganisa isivinini sokwakha sizonaka ngokukhethekile ukwakha isithombe nge-cache eyenziwe ngomumo. Ngakho, step by step:

  1. Sisusa izithombe endaweni ukuze imigijimo eyedlule ingaphazamisi ukuhlolwa.
    docker rmi $(docker images -q)
  2. Sethula isakhiwo okokuqala ngqa.
    time docker build -t app .
  3. Sishintsha ifayela elithi src/index.html - silingisa umsebenzi womklami.
  4. Siqhuba ukwakha okwesibili.
    time docker build -t app .

Uma imvelo yokwakha izithombe icushwe ngendlela efanele (ngaphezulu kwalokho okungezansi), lapho-ke ukwakhiwa kuqala, i-Docker izobe isivele inenqwaba yezilondolozi ebhodini. Umsebenzi wethu ukufunda indlela yokusebenzisa inqolobane ukuze ukwakhiwa kuhambe ngokushesha okukhulu. Njengoba sicabanga ukuthi ukusebenzisa isakhiwo ngaphandle kwenqolobane kwenzeka kanye kuphelaβ€”okokuqala ngqaβ€”ngakho-ke singaziba ukuthi sasihamba kancane kangakanani leso sikhathi sokuqala. Ekuhlolweni, ukugijima kwesibili kwesakhiwo kubalulekile kithi, lapho ama-caches asevele efudumele futhi sesilungele ukubhaka ikhekhe lethu. Kodwa-ke, amanye amathiphu azophinde athinte ukwakhiwa kokuqala.

Ake sibeke i-Dockerfile echazwe ngenhla kufolda yephrojekthi futhi siqale ukwakha. Konke ukufakwa kuhlu kufingqiwe ukuze kube lula ukufunda.

$ 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

Sishintsha okuqukethwe kwe-src/index.html bese siyiqhuba okwesibili.

$ 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

Ukuze ubone ukuthi sinaso yini isithombe, sebenzisa umyalo docker images:

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

Ngaphambi kokwakha, i-docker ithatha wonke amafayela kumongo wamanje futhi iwathumele ku-daemon yayo Sending build context to Docker daemon 409MB. Umongo wokwakha ucaciswe njengengxabano yokugcina kumyalo wokwakha. Esimweni sethu, lena inkomba yamanje - ".", - futhi i-Docker ihudula yonke into esinayo kule folda. 409 MB kuningi: ake sicabange ukuthi singayilungisa kanjani.

Ukunciphisa umongo

Ukunciphisa umongo, kunezinketho ezimbili. Noma faka wonke amafayela adingekayo ukuze ahlanganiswe kufolda ehlukile bese ukhomba umongo wedokhu kule folda. Lokhu kungase kungabi lula ngaso sonke isikhathi, ngakho-ke kungenzeka ukucacisa okuhlukile: okungafanele kuhudulelwe kumongo. Ukuze wenze lokhu, faka ifayela le-.dockerignore kuphrojekthi futhi ubonise lokho okungadingeki ekwakheni:

.git
/node_modules

bese uqhuba isakhiwo futhi:

$ 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 ingcono kakhulu kuno-409 MB. Siphinde sehlisa usayizi wesithombe ukusuka ku-1.74 kuya ku-1.38 GB:

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

Ake sizame ukunciphisa usayizi wesithombe ngokuqhubekayo.

Sisebenzisa i-Alpine

Enye indlela yokulondoloza kusayizi wesithombe ukusebenzisa isithombe esincane somzali. Isithombe somzali yisithombe esisekelwe kuso isithombe sethu esilungiselelwe. Isendlalelo esingezansi sicaciswa umyalo FROM ku-Dockerfile. Esimweni sethu, sisebenzisa isithombe esisekelwe ku-Ubuntu esesivele sinama-nodejs afakiwe. Futhi inesisindo...

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

... cishe igigabhayithi. Ungakwazi ukunciphisa kakhulu ivolumu ngokusebenzisa isithombe esisekelwe ku-Alpine Linux. I-Alpine iyi-Linux encane kakhulu. Isithombe sedokhu sama-nodejs asuselwa ku-alpine sinesisindo esingu-88.5 MB kuphela. Ngakho-ke ake sishintshe isithombe sethu esiphilayo ezindlini:

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

Bekufanele sifake ezinye izinto ezidingekayo ukuze sakhe uhlelo lokusebenza. Yebo, i-Angular ayakhi ngaphandle kwePython Β―(Β°_o)/Β―

Kepha usayizi wesithombe wehla waba ngu-150 MB:

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

Asiqhubeke nakakhulu.

Umhlangano we-Multistage

Akuyona yonke into esesithombeni esiyidingayo ekukhiqizeni.

$ 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

Ngosizo luka docker run app ls -lah sethule isitsha esisekelwe esithombeni sethu app futhi wenza umyalo kuwo ls -lah, ngemva kwalokho isitsha saqeda umsebenzi waso.

Ekukhiqizeni sidinga ifolda kuphela dist. Kulokhu, amafayela ngandlela-thile adinga ukunikezwa ngaphandle. Ungasebenzisa iseva ethile ye-HTTP kuma-nodejs. Kodwa sizokwenza kube lula. Qagela igama lesiRashiya elinezinhlamvu ezine "y". Kulungile! Ynzhynyksy. Ake sithathe isithombe nge-nginx, sibeke ifolda kuso dist kanye nokucushwa okuncane:

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

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

Ukwakhiwa kwezigaba eziningi kuzosisiza ukuthi senze konke lokhu. Masiguqule i-Dockerfile yethu:

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 .

Manje sineziqondiso ezimbili FROM ku-Dockerfile, ngayinye yazo isebenzisa isinyathelo sokwakha esihlukile. Sabiza eyokuqala builder, kodwa kusukela kokugcina KUSUKA, isithombe sethu sokugcina sizolungiselelwa. Isinyathelo sokugcina ukukopisha i-artifact yomhlangano wethu esinyathelweni sangaphambilini esithombeni sokugcina nge-nginx. Usayizi wesithombe wehle kakhulu:

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

Masiqhube isiqukathi ngesithombe sethu futhi siqinisekise ukuthi yonke into iyasebenza:

docker run -p8080:80 app

Sisebenzisa inketho -p8080:80, sidlulisele i-port 8080 emshinini wethu wokusingathwa ukuze ifake i-80 ngaphakathi kwesitsha lapho i-nginx isebenza khona. Vula kusiphequluli http://localhost:8080/ futhi siyasibona isicelo sethu. Konke kuyasebenza!

Amanye amathiphu okuthi ungasheshisa kanjani ukwakha izithombe ze-Docker. Isibonelo, kufika kumasekhondi angu-30

Ukunciphisa usayizi wesithombe ukusuka ku-1.74 GB ukuya ku-36 MB kunciphisa kakhulu isikhathi esisithathayo ukuletha uhlelo lwakho lokusebenza emkhiqizweni. Kodwa ake sibuyele esikhathini somhlangano.

$ 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

Ukushintsha ukuhleleka kwezingqimba

Izinyathelo zethu ezintathu zokuqala zigcinwe (ukusikisela Using cache). Esinyathelweni sesine, wonke amafayela ephrojekthi ayakopishwa futhi esinyathelweni sesihlanu okuncikile kufakwa RUN npm ci - kuze kufike ku-47.338s. Kungani ufake kabusha okuncikile ngaso sonke isikhathi uma kushintsha kuyaqabukela? Ake sithole ukuthi kungani zingagcinwanga kunqolobane. Iphuzu liwukuthi i-Docker izohlola isendlalelo ngesendlalelo ukuze ibone ukuthi umyalo namafayela ahlobene nawo ashintshile yini. Esinyathelweni sesine, sikopisha wonke amafayela wephrojekthi yethu, futhi phakathi kwawo, yiqiniso, kunezinguquko, ngakho-ke i-Docker ayithathi nje kuphela lolu ungqimba kunqolobane, kodwa futhi nayo yonke elandelayo! Masenze izinguquko ezincane ku-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 .

Okokuqala, i-package.json ne-package-lock.json ziyakopishwa, bese kufakwa okuncikile, futhi ngemva kwalokho yonke iphrojekthi ikopishiwe. Ngenxa yalokho:

$ 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

Imizuzwana engama-46 esikhundleni semizuzu emi-3 - okungcono kakhulu! Ukuhleleka okufanele kwezendlalelo kubalulekile: okokuqala sikopisha lokho okungashintshi, bese kuba yilokho okushintshayo okungavamile, futhi ekugcineni lokho okushintsha njalo.

Okulandelayo, amagama ambalwa mayelana nokuhlanganisa izithombe ezinhlelweni ze-CI/CD.

Ukusebenzisa izithombe zangaphambilini kunqolobane

Uma sisebenzisa uhlobo oluthile lwesixazululo se-SaaS ekwakheni, khona-ke inqolobane yendawo ye-Docker ingase ihlanzeke futhi ibe yintsha. Ukuze unikeze i-docker indawo yokuthola izendlalelo ezibhakiwe, mnike isithombe esakhiwe ngaphambilini.

Ake sithathe isibonelo sokwakha uhlelo lwethu lokusebenza ku-GitHub Actions. Sisebenzisa lokhu kulungiselelwa

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

Isithombe siqoqwe futhi sicindezelwe ku-GitHub Packages ngemizuzu emibili nemizuzwana engama-20:

Amanye amathiphu okuthi ungasheshisa kanjani ukwakha izithombe ze-Docker. Isibonelo, kufika kumasekhondi angu-30

Manje ake sishintshe ukwakha ukuze kusetshenziswe inqolobane ngokusekelwe ezithombeni ezakhiwe ngaphambilini:

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

Okokuqala sidinga ukukutshela ukuthi kungani imiyalo emibili yethulwa build. Iqiniso liwukuthi emhlanganweni wezigaba eziningi isithombe esiphumela sizoba isethi yezendlalelo kusukela esigabeni sokugcina. Kulokhu, izendlalelo ezivela ezendlalelo ezedlule ngeke zifakwe esithombeni. Ngakho-ke, lapho usebenzisa isithombe sokugcina esakhiweni sangaphambilini, i-Docker ngeke ikwazi ukuthola izendlalelo ezilungile zokwakha isithombe ngama-nodejs (isiteji somakhi). Ukuze kuxazululwe le nkinga, kwakhiwa isithombe esimaphakathi $IMAGE_NAME-builder-stage futhi iphushwa ku-GitHub Packages ukuze isetshenziswe ekwakhiweni okulandelayo njengomthombo wenqolobane.

Amanye amathiphu okuthi ungasheshisa kanjani ukwakha izithombe ze-Docker. Isibonelo, kufika kumasekhondi angu-30

Isikhathi sokuhlanganisa sincishisiwe saba umzuzu nengxenye. Isigamu somzuzu sichithwa kudonsa izithombe ezedlule.

Ukucabangela kusengaphambili

Enye indlela yokuxazulula inkinga yenqolobane ehlanzekile ye-Docker ukuhambisa ezinye izendlalelo kwenye i-Dockerfile, uyakhe ngokuhlukana, uyiphushele ku-Container Registry futhi uyisebenzise njengomzali.

Sakha isithombe sethu se-nodejs ukwakha uhlelo lokusebenza lwe-Angular. Dala i-Dockerfile.node kuphrojekthi

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

Siqoqa futhi siphushe isithombe esisesidlangalaleni ku-Docker Hub:

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

Manje ku-Dockerfile yethu enkulu sisebenzisa isithombe esiqediwe:

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

Esibonelweni sethu, isikhathi sokwakha asizange sinciphe, kodwa izithombe ezakhiwe ngaphambilini zingaba usizo uma unamaphrojekthi amaningi futhi kufanele ufake ukuncika okufanayo kulowo nalowo wabo.

Amanye amathiphu okuthi ungasheshisa kanjani ukwakha izithombe ze-Docker. Isibonelo, kufika kumasekhondi angu-30

Sibheke izindlela ezimbalwa zokusheshisa ukwakhiwa kwezithombe ze-docker. Uma ufuna ukuthunyelwa kuhambe ngokushesha, zama ukusebenzisa lokhu kuphrojekthi yakho:

  • ukunciphisa umongo;
  • ukusetshenziswa kwezithombe zomzali ezincane;
  • ukuhlanganiswa kwezigaba eziningi;
  • ukushintsha ukuhleleka kwemiyalelo ku-Dockerfile ukuze kusetshenziswe kahle inqolobane;
  • ukusetha i-cache ezinhlelweni ze-CI/CD;
  • ukudalwa kokuqala kwezithombe.

Ngethemba ukuthi isibonelo sizokucacisa ukuthi i-Docker isebenza kanjani, futhi uzokwazi ukumisa kahle ukuthunyelwa kwakho. Ukuze udlale ngezibonelo ezivela esihlokweni, indawo yokugcina idaliwe https://github.com/devopsprodigy/test-docker-build.

Source: www.habr.com

Engeza amazwana