Mbali isanapangidwe, m'masiku ano a oimba ovuta ndi CI / CD, pali njira yayitali yopitira pakudzipereka kupita ku mayeso ndi kutumiza. M'mbuyomu, mutha kukweza mafayilo atsopano kudzera pa FTP (palibe amene amachitanso izi, sichoncho?), Ndipo njira ya "kutumiza" idatenga masekondi. Tsopano muyenera kupanga pempho lophatikiza ndikudikirira nthawi yayitali kuti mawonekedwewo afike kwa ogwiritsa ntchito.
Gawo lanjira iyi ndikumanga chithunzi cha Docker. Nthawi zina msonkhano umatenga mphindi, nthawi zina mphindi makumi, zomwe sizingatchulidwe kuti ndizabwinobwino. M'nkhaniyi, titenga ntchito yosavuta yomwe tidzayiyika mu chithunzi, tigwiritse ntchito njira zingapo kuti tifulumizitse kumanga, ndikuyang'ana ma nuances a momwe njirazi zimagwirira ntchito.
Tili ndi chidziwitso chabwino pakupanga ndikuthandizira mawebusayiti azama media:
Timatumiza ku GitLab. Timasonkhanitsa zithunzi, kuzikankhira ku GitLab Registry ndikuzitulutsa kuti zipangidwe. Chotalika kwambiri pamndandandawu ndikusonkhanitsa zithunzi. Mwachitsanzo: popanda kukhathamiritsa, kumanga kumbuyo kulikonse kumatenga mphindi 14.
Pamapeto pake, zinaonekeratu kuti sitingakhalenso moyo wotere, ndipo tinakhala pansi kuti tidziwe chifukwa chake zithunzizo zinkatenga nthawi yaitali kuti zisawonongeke. Zimenezi zinachititsa kuti tichepetse nthawi ya msonkhanowo kufika masekondi 30!
Kwa nkhaniyi, kuti tisamangiridwe ku chilengedwe cha Chikumbutso, tiyeni tiwone chitsanzo cha kusonkhanitsa pulogalamu yopanda kanthu ya Angular. Chifukwa chake, tiyeni tipange pulogalamu yathu:
ng n app
Onjezani PWA kwa izo (tikupita patsogolo):
ng add @angular/pwa --project app
Pomwe mapaketi miliyoni a npm akutsitsidwa, tiyeni tiwone momwe chithunzi cha docker chimagwirira ntchito. Docker imapereka mwayi woyika mapulogalamu ndikuyendetsa pamalo akutali otchedwa chidebe. Chifukwa cha kudzipatula, mutha kuyendetsa zotengera zambiri nthawi imodzi pa seva imodzi. Zotengera ndizopepuka kwambiri kuposa makina enieni chifukwa zimayendera molunjika pa kernel. Kuti tigwiritse ntchito chidebe chokhala ndi pulogalamu yathu, choyamba tifunika kupanga chithunzi chomwe timayikamo chilichonse chofunikira kuti pulogalamu yathu igwire ntchito. Kwenikweni, chithunzi ndi kopi ya fayilo yamafayilo. Mwachitsanzo, tengani Dockerfile:
FROM node:12.16.2
WORKDIR /app
COPY . .
RUN npm ci
RUN npm run build --prod
Dockerfile ndi mndandanda wa malangizo; Pochita chilichonse, Docker amasunga zosintha pamafayilo ndikuzikuta pazimene zapita. Gulu lirilonse limapanga wosanjikiza wake. Ndipo chithunzi chomalizidwa ndi zigawo zophatikizidwa pamodzi.
Chofunika kudziwa: gawo lililonse la Docker limatha kubisa. Ngati palibe chomwe chasintha kuyambira pakumanga komaliza, ndiye kuti m'malo motsatira lamulo, docker itenga wosanjikiza wokonzeka. Popeza kuwonjezeka kwakukulu kwa liwiro la kumanga kudzakhala chifukwa cha kugwiritsa ntchito cache, pamene kuyeza liwiro la kumanga tidzatchera khutu kumanga fano ndi cache yokonzeka. Kotero, sitepe ndi sitepe:
- Timachotsa zithunzizo kwanuko kuti zomwe zidachitika kale zisakhudze mayeso.
docker rmi $(docker images -q)
- Timakhazikitsa kumangako koyamba.
time docker build -t app .
- Timasintha fayilo ya src/index.html - timatsanzira ntchito ya wopanga mapulogalamu.
- Timayendetsanso kumangako kachiwiri.
time docker build -t app .
Ngati malo opangira zithunzi akonzedwa bwino (zambiri pamunsimu), ndiye kuti kumangako kukayamba, Docker adzakhala ndi kale nkhokwe zambiri. Ntchito yathu ndikuphunzira momwe tingagwiritsire ntchito cache kuti kumangako kupite mofulumira momwe tingathere. Popeza tikuganiza kuti kuyendetsa nyumba popanda cache kumachitika kamodzi kokha - koyambirira - titha kunyalanyaza momwe nthawi yoyambayo idachedwera. M'mayesero, kuthamanga kwachiwiri kwa zomangamanga ndikofunika kwa ife, pamene ma cache atenthedwa kale ndipo takonzeka kuphika keke yathu. Komabe, malangizo ena adzakhudzanso kumanga koyamba.
Tiyeni tiyike Dockerfile yomwe yafotokozedwa pamwambapa mufoda ya polojekiti ndikuyamba kumanga. Mindandanda yonse yafupikitsidwa kuti muwerenge mosavuta.
$ 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
Timasintha zomwe zili mu src/index.html ndikuyendetsanso kachiwiri.
$ 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
Kuti muwone ngati tili ndi chithunzicho, yendetsani lamulo docker images
:
REPOSITORY TAG IMAGE ID CREATED SIZE
app latest 79f335df92d3 About a minute ago 1.74GB
Asanamange, docker amatenga mafayilo onse momwe alili ndikuwatumiza ku daemon yake Sending build context to Docker daemon 409MB
. Zomangamanga zimatchulidwa ngati mkangano womaliza ku lamulo lomanga. Kwa ife, ichi ndi chikwatu chapano - ".", - ndipo Docker amakoka chilichonse chomwe tili nacho mufoda iyi. 409 MB ndiyochuluka: tiyeni tiganizire momwe tingakonzere.
Kuchepetsa nkhaniyo
Kuchepetsa nkhaniyo, pali njira ziwiri. Kapena ikani mafayilo onse ofunikira kuti asonkhanitse mufoda ina ndikulozera zomwe zili mufoda iyi. Izi sizingakhale zosavuta nthawi zonse, kotero ndizotheka kutchula zosiyana: zomwe siziyenera kukokera m'nkhaniyo. Kuti muchite izi, ikani fayilo ya .dockerignore mu polojekiti ndikuwonetsa zomwe sizikufunika pakumanga:
.git
/node_modules
ndikuyambitsanso kumanganso:
$ 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 ndi yabwino kwambiri kuposa 409 MB. Tidachepetsanso kukula kwa chithunzi kuchokera ku 1.74 mpaka 1.38 GB:
REPOSITORY TAG IMAGE ID CREATED SIZE
app latest 4942f010792a 3 minutes ago 1.38GB
Tiyeni tiyese kuchepetsa kukula kwa chithunzicho.
Timagwiritsa ntchito Alpine
Njira ina yosungira pa kukula kwa chithunzi ndikugwiritsa ntchito chithunzi chaching'ono cha kholo. Chithunzi cha makolo ndi chithunzi chomwe chifaniziro chathu chakonzedwa. Chigawo chapansi chikufotokozedwa ndi lamulo FROM
mu Dockerfile. Kwa ife, tikugwiritsa ntchito chithunzi chochokera ku Ubuntu chomwe chili kale ndi ma nodejs. Ndipo amalemera...
$ docker images -a | grep node
node 12.16.2 406aa3abbc6c 17 minutes ago 916MB
... pafupifupi gigabyte. Mutha kuchepetsa kwambiri voliyumu pogwiritsa ntchito chithunzi chozikidwa pa Alpine Linux. Alpine ndi Linux yaying'ono kwambiri. Chithunzi cha docker cha ma nodejs ozikidwa pa alpine chimalemera 88.5 MB yokha. Kotero tiyeni tisinthe chithunzi chathu chamoyo m'nyumba:
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
Tinayenera kukhazikitsa zinthu zina zofunika kuti tipange pulogalamuyo. Inde, Angular samamanga popanda Python Β―(Β°_o)/Β―
Koma kukula kwa chithunzi kudatsikira ku 150 MB:
REPOSITORY TAG IMAGE ID CREATED SIZE
app latest aa031edc315a 22 minutes ago 761MB
Tiyeni tipite patsogolo.
Multistage msonkhano
Sizinthu zonse zomwe zili pachithunzichi zomwe timafunikira pakupanga.
$ 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
Ndi chithandizo cha docker run app ls -lah
tinayambitsa chidebe chotengera chithunzi chathu app
nachita lamulo mβmenemo ls -lah
, pambuyo pake chidebecho chinamaliza ntchito yake.
Popanga timangofunika chikwatu dist
. Pankhaniyi, mafayilo ayenera kuperekedwa kunja. Mutha kuyendetsa seva ya HTTP pa nodejs. Koma ife tipangitsa izo kukhala zosavuta. Tangoganizirani liwu la Chirasha lomwe lili ndi zilembo zinayi "y". Kulondola! Ynzhynyksy. Tiyeni titenge chithunzi ndi nginx, ikani chikwatu mmenemo dist
ndi config yaying'ono:
server {
listen 80 default_server;
server_name localhost;
charset utf-8;
root /app/dist;
location / {
try_files $uri $uri/ /index.html;
}
}
Kumanga kwa masitepe ambiri kudzatithandiza kuchita zonsezi. Tiyeni tisinthe Dockerfile yathu:
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 .
Tsopano tili ndi malangizo awiri FROM
mu Dockerfile, aliyense waiwo amayendetsa njira yomanga yosiyana. Tinayitana woyamba builder
, koma kuyambira komaliza KUCHOKERA, chithunzi chathu chomaliza chidzakonzedwa. Chomaliza ndikutengera chojambula cha msonkhano wathu mu gawo lapitalo mu chithunzi chomaliza ndi nginx. Kukula kwa chithunzicho kwatsika kwambiri:
REPOSITORY TAG IMAGE ID CREATED SIZE
app latest 2c6c5da07802 29 minutes ago 36MB
Tiyeni tiyendetse chidebecho ndi chithunzi chathu ndikuwonetsetsa kuti zonse zikuyenda:
docker run -p8080:80 app
Pogwiritsa ntchito -p8080:80 njira, tidatumiza doko 8080 pamakina athu obwera ku doko 80 mkati mwa chidebe momwe nginx imayendera. Tsegulani mu msakatuli
Kuchepetsa kukula kwa chithunzi kuchokera ku 1.74 GB mpaka 36 MB kumachepetsa kwambiri nthawi yomwe imatenga kuti mupereke pulogalamu yanu yopanga. Koma tiyeni tibwerere ku nthawi ya msonkhano.
$ 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
Kusintha dongosolo la zigawo
Masitepe athu atatu oyamba adasungidwa (hint Using cache
). Pa sitepe yachinayi, mafayilo onse a polojekiti amakopera ndipo pa sitepe yachisanu kudalira kumayikidwa RUN npm ci
- mpaka 47.338s. Chifukwa chiyani kuyikanso zodalira nthawi zonse ngati zikusintha kawirikawiri? Tiyeni tiwone chifukwa chake sanasungidwe. Chowonadi ndi chakuti Docker adzayang'ana wosanjikiza ndi wosanjikiza kuti awone ngati lamulo ndi mafayilo okhudzana nawo asintha. Pa gawo lachinayi, timakopera mafayilo onse a polojekiti yathu, ndipo pakati pawo, pali zosintha, kotero Docker samangotenga wosanjikiza uwu pa cache, komanso onse otsatira! Tiyeni tisinthe pang'ono pa 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 .
Choyamba, package.json ndi package-lock.json amakopedwa, ndiye zodalira zimayikidwa, ndipo pokhapokha polojekiti yonseyo imakopedwa. Zotsatira zake:
$ 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
Masekondi 46 m'malo mwa mphindi 3 - bwino kwambiri! Dongosolo loyenera la zigawo ndilofunika: choyamba timatengera zomwe sizisintha, ndiye zomwe zimasintha kawirikawiri, ndipo pamapeto pake zomwe zimasintha nthawi zambiri.
Kenako, mawu ochepa okhudza kusonkhanitsa zithunzi mu machitidwe a CI/CD.
Kugwiritsa ntchito zithunzi zakale posungira
Ngati tigwiritsa ntchito njira ya SaaS pomanga, ndiye kuti cache ya Docker yapafupi ikhoza kukhala yoyera komanso yatsopano. Kuti mupatse docker malo kuti atenge zigawo zophikidwa, mupatseni chithunzi chomangidwa kale.
Tiyeni titenge chitsanzo chopanga ntchito yathu mu GitHub Actions. Timagwiritsa ntchito 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
Chithunzicho chimasonkhanitsidwa ndikukankhidwira ku GitHub Packages mumphindi ziwiri ndi masekondi 20:
Tsopano tiyeni tisinthe kumanga kuti cache igwiritsidwe ntchito kutengera zithunzi zomwe zidamangidwa kale:
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
Choyamba tiyenera kukuuzani chifukwa chake malamulo awiri akuyambitsidwa build
. Chowonadi ndi chakuti mumsonkhano wamagulu ambiri chifaniziro chotsatira chidzakhala chamagulu kuchokera pagawo lomaliza. Pankhaniyi, zigawo zochokera m'magawo am'mbuyomu sizingaphatikizidwe pachithunzichi. Chifukwa chake, mukamagwiritsa ntchito chithunzi chomaliza kuchokera pamapangidwe am'mbuyomu, Docker sangathe kupeza zigawo zokonzeka kuti amange chithunzicho ndi ma nodejs (gawo lomanga). Pofuna kuthetsa vutoli, chithunzi chapakati chimapangidwa $IMAGE_NAME-builder-stage
ndipo imakankhidwira ku GitHub Packages kuti igwiritsidwe ntchito pomanganso ngati gwero la cache.
Nthawi ya msonkhano wonse inachepetsedwa kukhala mphindi imodzi ndi theka. Theka la miniti limatha kukoka zithunzi zam'mbuyo.
Kuganiziratu
Njira ina yothetsera vuto la cache yoyera ya Docker ndikusuntha zigawo zina mu Dockerfile ina, kumanga padera, kukankhira mu Container Registry ndikuigwiritsa ntchito ngati kholo.
Timapanga chithunzi chathu cha nodejs kuti tipange pulogalamu ya Angular. Pangani Dockerfile.node mu polojekitiyi
FROM node:12.16.2-alpine3.11
RUN apk --no-cache --update --virtual build-dependencies add
python
make
g++
Timasonkhanitsa ndikukankhira chithunzi chapagulu ku Docker Hub:
docker build -t exsmund/node-for-angular -f Dockerfile.node .
docker push exsmund/node-for-angular:latest
Tsopano mu Dockerfile yathu yayikulu timagwiritsa ntchito chithunzi chomalizidwa:
FROM exsmund/node-for-angular:latest as builder
...
Muchitsanzo chathu, nthawi yomanga sinachepe, koma zithunzi zomangidwa kale zitha kukhala zothandiza ngati muli ndi mapulojekiti ambiri ndipo muyenera kuyika zodalira zomwezo pa chilichonse.
Tidawona njira zingapo zofulumizitsa kupanga zithunzi za docker. Ngati mukufuna kuti ntchitoyo ipite mofulumira, yesani kugwiritsa ntchito izi mu polojekiti yanu:
- kuchepetsa nkhani;
- kugwiritsa ntchito zithunzi zazing'ono za makolo;
- multistage msonkhano;
- kusintha dongosolo la malangizo mu Dockerfile kuti mugwiritse ntchito bwino posungira;
- kukhazikitsa cache mu machitidwe a CI / CD;
- kupanga koyambirira kwa zithunzi.
Ndikukhulupirira kuti chitsanzochi chidzamveketsa bwino momwe Docker imagwirira ntchito, ndipo mudzatha kukonza momwe mungatumizire. Kuti muthe kusewera ndi zitsanzo kuchokera m'nkhaniyi, malo osungira apangidwa
Source: www.habr.com