Баъзе маслиҳатҳо оид ба суръат бахшидан ба сохтани тасвирҳои Docker. Масалан, то 30 сония

Пеш аз он ки хусусият ба истеҳсолот ворид шавад, дар ин айёми оркестрҳои мураккаб ва CI/CD, бояд аз ӯҳдадорӣ то озмоишҳо ва таҳвил роҳи тӯлонӣ тай шавад. Пештар, шумо метавонистед файлҳои навро тавассути FTP бор кунед (дигар ҳеҷ кас ин корро намекунад, дуруст?) ва раванди "ҷойгир" сонияҳоро мегирад. Акнун ба шумо лозим аст, ки дархости якҷоя эҷод кунед ва муддати тӯлонӣ интизор шавед, ки хусусият ба корбарон дастрас шавад.

Қисми ин роҳ сохтани тасвири Docker мебошад. Баъзан мачлис дакикахо, баъзан даххо дакика давом мекунад, ки онро муътадил номидан мумкин нест. Дар ин мақола, мо як барномаи оддиеро мегирем, ки онро дар тасвир бастабандӣ мекунем, якчанд усулҳоро барои суръат бахшидан ба сохтмон истифода мебарем ва ба нозукиҳои кор кардани ин усулҳо назар мекунем.

Баъзе маслиҳатҳо оид ба суръат бахшидан ба сохтани тасвирҳои Docker. Масалан, то 30 сония

Мо дар эҷод ва дастгирии вебсайтҳои ВАО таҷрибаи хуб дорем: ТАСС, Келл, "Рӯзномаи нав", Ҷумҳурии Тоҷикистон… Чанде пеш мо портфели худро тавассути интишори вебсайти маҳсулот васеъ кардем Ёддоштҳо. Ва дар ҳоле ки хусусиятҳои нав ба зудӣ илова карда шуданд ва хатогиҳои кӯҳна ислоҳ карда шуданд, густариши суст ба мушкилоти бузург табдил ёфт.

Мо ба GitLab ҷойгир мекунем. Мо тасвирҳоро ҷамъ мекунем, онҳоро ба Registry GitLab тела медиҳем ва онҳоро ба истеҳсолот мебарем. Дарозитарин чизе дар ин рӯйхат ҷамъ кардани тасвирҳо мебошад. Масалан: бидуни оптимизатсия, ҳар як сохтани пушти сар 14 дақиқа вақт мегирад.

Баъзе маслиҳатҳо оид ба суръат бахшидан ба сохтани тасвирҳои Docker. Масалан, то 30 сония

Дар охир маълум шуд, ки мо дигар ин хел зиндагӣ карда наметавонем ва мо нишастем, то бифаҳмем, ки чаро тасвирҳо ин қадар тӯлонӣ ҷамъоварӣ мекунанд. Дар натича ба мо муяссар шуд, ки вакти монтажро то 30 сония кам кунем!

Баъзе маслиҳатҳо оид ба суръат бахшидан ба сохтани тасвирҳои Docker. Масалан, то 30 сония

Барои ин мақола, барои он ки ба муҳити Reminder пайваст нашавед, биёед мисоли васл кардани барномаи холии Angular-ро дида бароем. Пас, биёед барномаи худро эҷод кунем:

ng n app

Ба он PWA илова кунед (мо пешравем):

ng add @angular/pwa --project app

Ҳангоме ки як миллион бастаҳои npm зеркашӣ карда мешаванд, биёед бифаҳмем, ки тасвири докер чӣ гуна кор мекунад. Docker қобилияти бастабандии барномаҳоро таъмин мекунад ва онҳоро дар муҳити ҷудошуда бо номи контейнер иҷро мекунад. Бо шарофати изолятсия, шумо метавонед бисёр контейнерҳоро ҳамзамон дар як сервер иҷро кунед. Контейнерҳо нисбат ба мошинҳои виртуалӣ хеле сабуктаранд, зеро онҳо бевосита дар ядрои система кор мекунанд. Барои кор кардани контейнер бо замимаи мо, мо аввал бояд тасвиреро созем, ки дар он ҳама чизҳои заруриро барои иҷрои барномаамон баста мекунем. Аслан, тасвир нусхаи системаи файлист. Масалан, файли Docker-ро гиред:

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

Dockerfile маҷмӯи дастурҳост; Бо иҷрои ҳар яки онҳо, Docker тағиротро дар системаи файлӣ захира мекунад ва онҳоро дар пешина ҷойгир мекунад. Ҳар як даста қабати худро эҷод мекунад. Ва тасвири тайёр қабатҳои бо ҳам муттаҳидшуда мебошад.

Чиро донистан муҳим аст: ҳар як қабати Docker метавонад кэш кунад. Агар пас аз сохтани охирин чизе тағйир наёбад, пас ба ҷои иҷрои фармон, докер қабати тайёрро мегирад. Азбаски афзоиши асосии суръати сохтмон аз ҳисоби истифодаи кэш хоҳад буд, ҳангоми чен кардани суръати сохтмон мо махсусан ба сохтани тасвир бо кэши тайёр диққат медиҳем. Пас, қадам ба қадам:

  1. Мо тасвирҳоро ба таври маҳаллӣ нест мекунем, то иҷроҳои қаблӣ ба санҷиш таъсир накунанд.
    docker rmi $(docker images -q)
  2. Мо бори аввал сохтмонро оғоз мекунем.
    time docker build -t app .
  3. Мо файли src/index.html -ро иваз мекунем - ба кори барномасоз тақлид мекунем.
  4. Мо сохтмонро бори дуюм ба рох мемонем.
    time docker build -t app .

Агар муҳити сохтани тасвирҳо дуруст танзим карда шуда бошад (бештар дар бораи он дар зер), пас вақте ки сохтмон оғоз мешавад, Docker аллакай як қатор кэшҳоро дар борт хоҳад дошт. Вазифаи мо аз он иборат аст, ки чӣ тавр истифода бурдани кэшро омӯзем, то сохтмон ҳарчи зудтар анҷом ёбад. Азбаски мо тахмин мезанем, ки иҷро кардани сохтмон бидуни кэш танҳо як маротиба рух медиҳад - бори аввал - мо метавонем нодида гирем, ки ин бори аввал то чӣ андоза суст буд. Дар озмоишҳо, даври дуюми сохтмон барои мо муҳим аст, вақте ки кэшҳо аллакай гарм шудаанд ва мо барои пухтани торт омодаем. Бо вуҷуди ин, баъзе маслиҳатҳо инчунин ба сохтани аввал таъсир мерасонанд.

Биёед Dockerfile-ро, ки дар боло тавсиф шудааст, дар папкаи лоиҳа ҷойгир кунем ва сохтани онро оғоз кунем. Ҳама рӯйхатҳо барои хондан осон карда шудаанд.

$ 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

Пеш аз сохтан, docker ҳамаи файлҳоро дар контексти ҷорӣ мегирад ва онҳоро ба демони худ мефиристад Sending build context to Docker daemon 409MB. Контексти сохтан ҳамчун далели охирини фармони сохтмон муайян карда мешавад. Дар ҳолати мо, ин феҳристи ҷорӣ аст - ".", - ва Docker ҳама чизеро, ки мо дар ин ҷузвдон дорем, кашола мекунад. 409 МБ зиёд аст: биёед дар бораи он фикр кунем, ки чӣ тавр онро ислоҳ кунем.

Кам кардани контекст

Барои кам кардани контекст, ду вариант вуҷуд дорад. Ё ҳамаи файлҳои барои васлкунӣ заруриро дар папкаи алоҳида ҷойгир кунед ва контексти докерро ба ин ҷузвдон нишон диҳед. Ин метавонад на ҳамеша қулай бошад, бинобар ин метавон истисноҳоро муайян кард: он чизеро, ки набояд ба контекст кашола кард. Барои ин, файли .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 МБ хеле беҳтар аст. Мо инчунин андозаи тасвирро аз 1.74 то 1.38 ГБ кам кардем:

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

Биёед кӯшиш кунем, ки андозаи тасвирро боз ҳам кам кунем.

Мо Alpine истифода мебарем

Роҳи дигари сарфа кардани андозаи тасвир ин истифодаи тасвири хурди волидайн аст. Образи волидайн образест, ки дар асоси он образи мо тайёр карда шудааст. Қабати поёнӣ бо фармон муайян карда мешавад FROM дар Dockerfile. Дар ҳолати мо, мо тасвири Ubuntu-ро истифода мебарем, ки аллакай nodejs насб шудааст. Ва вазн дорад ...

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

... қариб як гигабайт. Шумо метавонед бо истифода аз тасвире, ки дар асоси Alpine Linux асос ёфтааст, овозро ба таври назаррас кам кунед. Alpine як Linux хеле хурд аст. Тасвири докер барои nodejs дар асоси кӯҳӣ ҳамагӣ 88.5 МБ вазн дорад. Пас биёед симои зиндаи худро дар хонаҳо иваз кунем:

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 МБ коҳиш ёфт:

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-ро дар nodejs иҷро кунед. Аммо мо онро осонтар хоҳем кард. Як калимаи русиро тахмин кунед, ки дорои чор ҳарфи “y” аст. Дуруст! Инжиникси. Биёед бо nginx тасвир гирем, дар он папка гузорем dist ва конфигуратсияи хурд:

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

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

Сохтмони бисёрсоҳавӣ ба мо дар иҷрои ҳамаи ин кӯмак мекунад. Биёед файли Docker-и худро тағир диҳем:

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 дар Dockerfile, ҳар яке аз онҳо як қадами сохти гуногунро иҷро мекунанд. Мо ба аввалин занг задем builder, вале аз АЗ охирин сар карда, тасвири охирини мо омода мешавад. Қадами охирин ин нусхабардории артефакти маҷлиси мо дар қадами қаблӣ ба тасвири ниҳоӣ бо nginx мебошад. Андозаи тасвир ба таври назаррас коҳиш ёфтааст:

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

Биёед контейнерро бо тасвири худ иҷро кунем ва боварӣ ҳосил кунем, ки ҳама чиз кор мекунад:

docker run -p8080:80 app

Бо истифода аз опсияи -p8080:80, мо порти 8080-ро дар мошини мизбони худ ба порти 80 дар дохили контейнер, ки nginx кор мекунад, интиқол додем. Дар браузер кушоед http://localhost:8080/ ва мо аризаи худро мебинем. Ҳама чиз кор мекунад!

Баъзе маслиҳатҳо оид ба суръат бахшидан ба сохтани тасвирҳои Docker. Масалан, то 30 сония

Коҳиш додани андозаи тасвир аз 1.74 ГБ то 36 МБ вақти интиқоли аризаи шуморо ба истеҳсолот ба таври назаррас коҳиш медиҳад. Аммо биёед ба вақти ҷамъомад баргардем.

$ 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.338 с. Чаро вобастагиҳоро ҳар дафъа аз нав насб кунед, агар онҳо хеле кам тағир меёбанд? Биёед бифаҳмем, ки чаро онҳо кэш нашудаанд. Гап дар он аст, ки Docker қабат ба қабат тафтиш мекунад, то бубинад, ки оё фармон ва файлҳои марбут ба он тағир ёфтаанд. Дар қадами чорум, мо ҳамаи файлҳои лоиҳаи худро нусхабардорӣ мекунем ва дар байни онҳо, албатта, тағиротҳо мавҷуданд, аз ин рӯ Docker на танҳо ин қабатро аз кэш намегирад, балки ҳамаи файлҳои минбаъдаро низ мегирад! Биёед ба 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.

Истифодаи тасвирҳои қаблӣ барои кэш

Агар мо барои сохтани ягон намуди ҳалли SaaS истифода барем, пас кэши маҳаллии Docker метавонад тоза ва тару тоза бошад. Барои ба докер ҷой додани қабатҳои пухта, ба ӯ тасвири қаблии сохташударо диҳед.

Биёед мисоли сохтани барномаи худро дар GitHub Actions гирем. Мо ин конфигуратсияро истифода мебарем

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 интиқол дода мешавад:

Баъзе маслиҳатҳо оид ба суръат бахшидан ба сохтани тасвирҳои Docker. Масалан, то 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. Гап дар он аст, ки дар як маҷлиси бисёрзинагӣ тасвири натиҷавӣ маҷмӯи қабатҳои марҳилаи охирин хоҳад буд. Дар ин ҳолат, қабатҳои қабатҳои қаблӣ ба тасвир дохил карда намешаванд. Аз ин рӯ, ҳангоми истифодаи тасвири ниҳоӣ аз сохтани қаблӣ, Docker наметавонад қабатҳои омодаро барои сохтани тасвир бо nodejs (марҳилаи созанда) пайдо кунад. Барои халли ин масъала образи мобайнй ба вучуд оварда мешавад $IMAGE_NAME-builder-stage ва ба бастаҳои GitHub интиқол дода мешавад, то он метавонад дар сохтани минбаъда ҳамчун манбаи кэш истифода шавад.

Баъзе маслиҳатҳо оид ба суръат бахшидан ба сохтани тасвирҳои Docker. Масалан, то 30 сония

Вакти умумии монтаж якуним дакика кам шуд. Барои кашидани тасвирҳои қаблӣ ним дақиқа сарф мешавад.

Тамошои пешакӣ

Роҳи дигари ҳалли мушкилоти кэши тозаи Docker ин интиқол додани баъзе қабатҳо ба дигар Dockerfile, сохтани он дар алоҳидагӣ, тела додан ба Феҳристи контейнерҳо ва истифода бурдани он ҳамчун волидайн мебошад.

Мо тасвири nodejs-и худро барои сохтани як барномаи Angular эҷод мекунем. Дар лоиҳа Dockerfile.node эҷод кунед

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

Мо тасвири оммавиро дар Docker Hub ҷамъоварӣ мекунем:

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

Дар мисоли мо, вақти сохтмон кам нашудааст, аммо тасвирҳои қаблан сохташуда метавонанд муфид бошанд, агар шумо лоиҳаҳои зиёде дошта бошед ва дар ҳар яки онҳо ҳамон вобастагӣ насб кунед.

Баъзе маслиҳатҳо оид ба суръат бахшидан ба сохтани тасвирҳои Docker. Масалан, то 30 сония

Мо якчанд усулҳоро барои суръат бахшидан ба сохтани тасвирҳои докер дида баромадем. Агар шумо хоҳед, ки ҷойгиркунӣ зуд ба амал ояд, кӯшиш кунед, ки инро дар лоиҳаи худ истифода баред:

  • кам кардани контекст;
  • истифодаи тасвирҳои хурди волидайн;
  • монтажи бисёрсоҳавӣ;
  • тағир додани тартиби дастурҳо дар Dockerfile барои истифодаи самараноки кэш;
  • насб кардани кэш дар системаҳои CI/CD;
  • эҷоди пешакии тасвирҳо.

Умедворам, ки мисол равшантар мекунад, ки чӣ тавр Docker кор мекунад ва шумо метавонед ҷойгиркунии худро ба таври оптималӣ танзим кунед. Барои бозӣ кардан бо мисолҳои мақола, як анбор сохта шудааст https://github.com/devopsprodigy/test-docker-build.

Манбаъ: will.com

Илова Эзоҳ