د ډاکر عکسونو جوړولو ګړندي کولو څرنګوالي په اړه ځینې لارښوونې. د مثال په توګه، تر 30 ثانیو پورې

مخکې لدې چې یو فیچر تولید ته راشي ، د پیچلي آرکیسټرټرانو او CI/CD په دې ورځو کې ، ازموینې او تحویلۍ ته ژمنتیا ته اوږده لاره شتون لري. مخکې، تاسو کولی شئ د FTP له لارې نوي فایلونه اپلوډ کړئ (هیڅوک نور دا کار نه کوي، سمه ده؟)، او د "ګمارنې" پروسې څو ثانیې وخت نیولی. اوس تاسو اړتیا لرئ د ادغام غوښتنه رامینځته کړئ او کاروونکو ته د ځانګړتیا لپاره ډیر وخت انتظار وکړئ.

د دې لارې برخه د ډاکر عکس جوړول دي. ځینې ​​​​وختونه مجلس دقیقې دوام کوي، ځینې وختونه لسګونه دقیقې، چې په سختۍ سره عادي بلل کیدی شي. پدې مقاله کې ، موږ به یو ساده غوښتنلیک واخلو چې موږ به یې په عکس کې بسته کړو ، د جوړولو ګړندي کولو لپاره ډیری میتودونه پلي کړو ، او د دې میتودونو کار کولو څرنګوالي باریکیو ته وګورو.

د ډاکر عکسونو جوړولو ګړندي کولو څرنګوالي په اړه ځینې لارښوونې. د مثال په توګه، تر 30 ثانیو پورې

موږ د رسنیو ویب پاڼې په جوړولو او ملاتړ کې ښه تجربه لرو: TASS, بیل, "نوی اخبار", جمهوریت... ډیر وخت دمخه موږ د محصول ویب پاڼې په خپرولو سره خپل پورټ فولیو پراخ کړ یادونې. او پداسې حال کې چې نوې ب featuresې په چټکۍ سره اضافه شوي او زاړه بګونه تنظیم شوي ، ورو پلي کول یوه لویه ستونزه شوه.

موږ GitLab ته ځای په ځای کوو. موږ عکسونه راټولوو، د GitLab راجسټری ته یې فشار ورکوو او تولید ته یې ورسوو. پدې لیست کې ترټولو اوږد شی د عکسونو راټولول دي. د مثال په توګه: د اصلاح کولو پرته، هر پس منظر جوړونه 14 دقیقې وخت نیسي.

د ډاکر عکسونو جوړولو ګړندي کولو څرنګوالي په اړه ځینې لارښوونې. د مثال په توګه، تر 30 ثانیو پورې

په پای کې، دا څرګنده شوه چې موږ نور نور د دې په څیر ژوند نشو کولی، او موږ ناست یو ترڅو معلومه کړو چې ولې انځورونه راټولولو کې دومره وخت نیسي. د پایلې په توګه، موږ وکولی شو د مجلس وخت 30 ثانیو ته راټیټ کړو!

د ډاکر عکسونو جوړولو ګړندي کولو څرنګوالي په اړه ځینې لارښوونې. د مثال په توګه، تر 30 ثانیو پورې

د دې مقالې لپاره ، د دې لپاره چې د یادونې چاپیریال سره وتړل نشي ، راځئ چې د خالي انګول غوښتنلیک راټولولو مثال وګورو. نو، راځئ چې زموږ غوښتنلیک جوړ کړو:

ng n app

دې ته PWA اضافه کړئ (موږ پرمختللی یو):

ng add @angular/pwa --project app

پداسې حال کې چې یو ملیون npm کڅوړې ډاونلوډ کیږي ، راځئ چې معلومه کړو چې د ډاکر عکس څنګه کار کوي. ډاکر د غوښتنلیکونو بسته کولو وړتیا چمتو کوي او په یو جلا چاپیریال کې یې چلوي چې د کانټینر په نوم یادیږي. د انزوا څخه مننه ، تاسو کولی شئ په یو سرور کې ډیری کانټینرونه په ورته وخت کې پرمخ وړئ. کانټینرونه د مجازی ماشینونو په پرتله خورا سپک دي ځکه چې دوی په مستقیم ډول د سیسټم کرنل پرمخ ځي. زموږ د غوښتنلیک سره د کانټینر چلولو لپاره، موږ لومړی باید یو انځور جوړ کړو چې په کې به موږ هر هغه څه بسته کړو چې زموږ د غوښتنلیک د چلولو لپاره اړین وي. په اصل کې، یو انځور د فایل سیسټم یوه کاپي ده. د مثال په توګه، Dockerfile واخلئ:

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

Dockerfile د لارښوونو یوه ټولګه ده؛ د هر یو په کولو سره ، ډاکر به د فایل سیسټم کې بدلونونه خوندي کړي او په تیرو کې به یې پوښ کړي. هر ټیم خپل پرت جوړوي. او بشپړ شوی عکس د پرتونو سره یوځای شوی دی.

هغه څه چې پوهیدل مهم دي: هر ډاکر پرت کولی شي زیرمه کړي. که چیرې د وروستي جوړیدو راهیسې هیڅ شی نه وي بدل شوی ، نو د قوماندې اجرا کولو پرځای ، ډاکر به چمتو شوی پرت واخلي. څرنګه چې د جوړونې سرعت کې اصلي زیاتوالی به د کیچ کارولو له امله وي، کله چې د جوړونې سرعت اندازه کول موږ به په ځانګړې توګه د چمتو شوي کیچ سره د عکس جوړولو ته پام وکړو. نو، ګام په ګام:

  1. موږ عکسونه په محلي ډول حذف کوو ترڅو پخواني منډې په ازموینه اغیزه ونکړي.
    docker rmi $(docker images -q)
  2. موږ د لومړي ځل لپاره جوړونه پیل کوو.
    time docker build -t app .
  3. موږ د src/index.html فایل بدلوو - موږ د پروګرامر کار تقلید کوو.
  4. موږ دوهم ځل جوړونه چلوو.
    time docker build -t app .

که چیرې د عکسونو رامینځته کولو چاپیریال په سمه توګه تنظیم شوی وي (لاندې نور یې) ، نو کله چې جوړونه پیل شي ، ډاکر به دمخه په تخته کې د کیچونو یوه ډله ولري. زموږ دنده دا ده چې د کیچ کارولو څرنګوالي زده کړئ ترڅو جوړونه ژر تر ژره پرمخ ولاړ شي. څرنګه چې موږ فرض کوو چې د کیچ پرته د جوړونې چلول یوازې یو ځل پیښیږي - لومړی ځل - موږ له دې امله سترګې پټولی شو چې دا لومړی ځل څومره ورو و. په ازموینو کې، د جوړونې دویم پړاو زموږ لپاره مهم دی، کله چې کیچونه لا دمخه ګرم شوي وي او موږ چمتو یو چې خپل کیک پخه کړو. په هرصورت، ځینې لارښوونې به په لومړي جوړښت اغیزه وکړي.

راځئ چې پورته ذکر شوي ډاکر فایل د پروژې فولډر کې واچوئ او جوړونه یې پیل کړئ. ټول لیستونه د لوستلو اسانتیا لپاره راټول شوي.

$ 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

موږ د src/index.html منځپانګې بدلوو او دویم ځل یې چلوو.

$ 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

د دې لپاره چې وګورئ چې موږ عکس لرو، کمانډ چل کړئ docker images:

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

د جوړولو دمخه ، ډاکر په اوسني شرایطو کې ټولې فایلونه اخلي او خپل ډیمون ته یې لیږي Sending build context to Docker daemon 409MB. د جوړونې شرایط د جوړونې کمانډ ته د وروستي دلیل په توګه مشخص شوي. زموږ په قضیه کې ، دا اوسنی لارښود دی - "." ، - او ډاکر هر هغه څه راوباسي چې موږ یې پدې فولډر کې لرو. 409 MB ډیر دی: راځئ چې د دې د حل کولو څرنګوالي په اړه فکر وکړو.

د شرایطو کمول

د شرایطو کمولو لپاره، دوه اختیارونه شتون لري. یا د مجلس لپاره اړین ټول فایلونه په جلا فولډر کې واچوئ او د ډاکر شرایط دې فولډر ته په ګوته کړئ. دا ممکن تل اسانه نه وي، نو دا ممکنه ده چې استثناوې مشخصې کړئ: څه شی باید په شرایطو کې ونه ایستل شي. د دې کولو لپاره، د .dockerignore فایل په پروژه کې واچوئ او په ګوته کړئ چې د جوړولو لپاره څه ته اړتیا نشته:

.git
/node_modules

او بیا جوړونه پرمخ وړئ:

$ 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 د 409 MB څخه ډیر ښه دی. موږ د عکس اندازه هم له 1.74 څخه 1.38 GB ته راټیټه کړه:

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

راځئ هڅه وکړو چې د عکس اندازه نوره هم کمه کړو.

موږ الپین کاروو

د عکس اندازې خوندي کولو بله لاره د کوچني والدین عکس کارول دي. د مور او پلار انځور هغه انځور دی چې پر بنسټ یې زموږ انځور چمتو کیږي. لاندې پرت د کمانډ لخوا مشخص شوی FROM په ډاکرفایل کې. زموږ په قضیه کې ، موږ د اوبنټو میشته عکس کاروو چې دمخه یې نوډجونه نصب کړي دي. او دا وزن لري ...

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

... تقریبا یو ګیګابایټ. تاسو کولی شئ د الپین لینکس پراساس د عکس په کارولو سره حجم د پام وړ کم کړئ. الپین یو ډیر کوچنی لینکس دی. د الپین پر بنسټ د نوډجونو لپاره د ډاکر عکس یوازې 88.5 MB وزن لري. نو راځئ چې خپل ژوندی انځور په کورونو کې ځای کړو:

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

موږ باید ځینې شیان نصب کړو چې د غوښتنلیک جوړولو لپاره اړین دي. هو، Angular د Python ¯(°_o)/¯ پرته نه جوړیږي

مګر د عکس اندازه 150 MB ته راټیټه شوه:

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

راځئ چې نور هم لاړ شو.

د څو پړاوونو مجلس

هرڅه چې په عکس کې دي هغه څه ندي چې موږ یې په تولید کې اړتیا لرو.

$ 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

د مرستې په مرسته docker run app ls -lah موږ د خپل عکس پراساس یو کانټینر پیل کړ app او په هغه کې یې امر اجرا کړ ls -lahله هغې وروسته کانټینر خپل کار بشپړ کړ.

په تولید کې موږ یوازې یو فولډر ته اړتیا لرو dist. په دې حالت کې، فایلونه باید بهر ته ورکړل شي. تاسو کولی شئ په نوډز کې ځینې HTTP سرور چل کړئ. مګر موږ به دا اسانه کړو. یوه روسي کلمه اټکل کړئ چې څلور توري لري "y". سمه ده! Ynzhynyksy. راځئ چې د نګینکس سره یو عکس واخلو، په هغې کې یو فولډر واچوئ dist او یو کوچنی ترتیب:

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

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

څو مرحلې جوړونه به موږ سره د دې ټولو په ترسره کولو کې مرسته وکړي. راځئ چې زموږ د ډاکر فایل بدل کړو:

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 .

اوس موږ دوه لارښوونې لرو FROM په ډاکرفایل کې، هر یو د مختلف جوړونې مرحله پرمخ وړي. موږ لومړی غږ وکړ builder، مګر د وروستي FROM څخه پیل کیږي ، زموږ وروستی عکس به چمتو شي. وروستی ګام دا دی چې زموږ د مجلس اثار په تیر مرحله کې د نګینکس سره وروستي عکس ته کاپي کړئ. د انځور اندازه د پام وړ کمه شوې ده:

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

راځئ چې کانټینر زموږ د عکس سره پرمخ بوځو او ډاډ ترلاسه کړو چې هرڅه کار کوي:

docker run -p8080:80 app

د -p8080:80 اختیار په کارولو سره ، موږ په خپل کوربه ماشین کې پورټ 8080 د کانټینر دننه 80 پورټ ته لیږلی چیرې چې نګینکس چلیږي. په براوزر کې خلاص کړئ http://localhost:8080/ او موږ خپل غوښتنلیک ګورو. هرڅه کار کوي!

د ډاکر عکسونو جوړولو ګړندي کولو څرنګوالي په اړه ځینې لارښوونې. د مثال په توګه، تر 30 ثانیو پورې

د عکس اندازه له 1.74 GB څخه 36 MB ته کمول د پام وړ وخت کموي چې ستاسو غوښتنلیک تولید ته وړاندې کوي. مګر راځئ چې بیرته د مجلس وخت ته لاړ شو.

$ 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

د پرتونو ترتیب بدلول

زموږ لومړني درې مرحلې خوندي شوي (اشاره Using cache). په څلورم ګام کې، د پروژې ټولې فایلونه کاپي شوي او په پنځم ګام کې انحصارونه نصب شوي RUN npm ci - څومره چې 47.338s. ولې هر وخت انحصارونه له سره نصب کړئ که چیرې دوی خورا لږ بدل شي؟ راځئ چې معلومه کړو چې ولې دوی زیرمه شوي ندي. ټکی دا دی چې ډاکر به د پرت په واسطه پرت وګوري ترڅو وګوري چې ایا قومانده او ورسره تړلې فایلونه بدل شوي. په څلورم ګام کې، موږ زموږ د پروژې ټولې فایلونه کاپي کوو، او د دوی په منځ کې، البته، بدلونونه شتون لري، نو ډاکر نه یوازې دا پرت د کیچ څخه نه اخلي، بلکې ټول راتلونکی هم! راځئ چې په 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 .

لومړی، package.json او package-lock.json کاپي شوي، بیا انحصارونه نصب شوي، او یوازې له هغې وروسته ټوله پروژه کاپي کیږي. په پایله کښې:

$ 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 دقیقو پرځای 3 ثانیې - ډیر ښه! د پرتونو سم ترتیب مهم دی: لومړی موږ هغه څه کاپي کوو چې بدلون نه کوي، بیا څه چې په ندرت سره بدلیږي، او په پای کې کوم چې ډیری وختونه بدلیږي.

بیا، په CI/CD سیسټمونو کې د انځورونو راټولولو په اړه یو څو ټکي.

د کیچ لپاره د پخوانیو عکسونو کارول

که موږ د جوړولو لپاره یو ډول ساس حل وکاروو ، نو د ځایی ډاکر کیچ ممکن پاک او تازه وي. د دې لپاره چې ډاکر ته د پخو پرتونو ترلاسه کولو لپاره ځای ورکړئ، هغه ته پخوانی جوړ شوی انځور ورکړئ.

راځئ چې په GitHub عملونو کې زموږ د غوښتنلیک جوړولو مثال واخلو. موږ دا ترتیب کاروو

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

عکس په دوه دقیقو او 20 ثانیو کې د GitHub کڅوړو ته راټول شوی او فشار ورکول کیږي:

د ډاکر عکسونو جوړولو ګړندي کولو څرنګوالي په اړه ځینې لارښوونې. د مثال په توګه، تر 30 ثانیو پورې

اوس راځئ چې جوړښت بدل کړو ترڅو د پخوانیو جوړ شوي عکسونو پراساس کیچ کارول کیږي:

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

لومړی موږ باید تاسو ته ووایو چې ولې دوه کمانډونه پیل شوي build. حقیقت دا دی چې په څو مرحلو مجلس کې پایله شوې عکس به د وروستي مرحلې څخه د پرتونو سیټ وي. په دې حالت کې، د پخوانیو پرتونو پرتونه به په انځور کې شامل نه وي. له همدې امله ، کله چې د تیر جوړونې څخه وروستی عکس وکاروئ ، نوډجز (د جوړونکي مرحله) سره د عکس جوړولو لپاره چمتو شوي پرتونه به ونه موندل شي. د دې ستونزې د حل لپاره، یو منځنی انځور جوړ شوی $IMAGE_NAME-builder-stage او د GitHub کڅوړو ته اړول کیږي ترڅو دا د کیچ سرچینې په توګه په راتلونکي جوړ کې وکارول شي.

د ډاکر عکسونو جوړولو ګړندي کولو څرنګوالي په اړه ځینې لارښوونې. د مثال په توګه، تر 30 ثانیو پورې

د غونډې ټول وخت یو نیم دقیقو ته راټیټ شو. نیمه دقیقه د پخوانیو عکسونو په ایستلو مصرف کیږي.

Preimaging

د پاک ډاکر کیچ ستونزې حل کولو بله لاره دا ده چې ځینې پرتونه بل ډاکر فایل ته واړوئ ، په جلا توګه یې جوړ کړئ ، د کانټینر ثبت ته یې فشار ورکړئ او د مور او پلار په توګه یې وکاروئ.

موږ د زاویه غوښتنلیک جوړولو لپاره خپل نوډج عکس رامینځته کوو. په پروژه کې Dockerfile.node جوړ کړئ

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

موږ په ډاکر هب کې عامه عکس راټول او فشار راوړو:

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

اوس زموږ په اصلي ډاکر فایل کې موږ بشپړ شوی عکس کاروو:

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

زموږ په مثال کې، د جوړولو وخت کم شوی نه دی، مګر مخکې جوړ شوي انځورونه ګټور کیدی شي که تاسو ډیری پروژې لرئ او په هر یو کې ورته انحصارونه نصب کړئ.

د ډاکر عکسونو جوړولو ګړندي کولو څرنګوالي په اړه ځینې لارښوونې. د مثال په توګه، تر 30 ثانیو پورې

موږ د ډاکر عکسونو رامینځته کولو ګړندي کولو لپاره ډیری میتودونه وګورو. که تاسو غواړئ ګمارنه په چټکۍ سره پرمخ لاړ شئ، هڅه وکړئ دا په خپله پروژه کې وکاروئ:

  • د شرایطو کمول؛
  • د کوچني والدینو عکسونو کارول؛
  • د څو پړاوونو مجلس؛
  • په ډاکرفایل کې د لارښوونو ترتیب بدلول ترڅو د کیچ مؤثره کار واخلي؛
  • په CI/CD سیسټمونو کې د کیچ ترتیب کول؛
  • د انځورونو لومړنی جوړول.

زه امید لرم چې مثال به دا روښانه کړي چې ډاکر څنګه کار کوي ، او تاسو به وکولی شئ په مناسب ډول خپل ګمارنه تنظیم کړئ. د مقالې څخه د مثالونو سره لوبې کولو لپاره ، یو ذخیره جوړه شوې https://github.com/devopsprodigy/test-docker-build.

سرچینه: www.habr.com

Add a comment