Докерын зургийг хэрхэн хурдасгах талаар зарим зөвлөмжүүд. Жишээлбэл, 30 секунд хүртэл

Онцлогыг үйлдвэрлэлд оруулахаас өмнө нарийн төвөгтэй найрал хөгжимчид болон CI/CD хөгжсөн өнөө үед амлалтаас эхлээд туршилт, хүргэлт хүртэл урт замыг туулах ёстой. Өмнө нь та шинэ файлуудыг FTP-ээр дамжуулан байршуулж болох байсан (хэн ч үүнийг хийхгүй, тийм ээ?), "байршуулах" үйл явц хэдхэн секунд үргэлжилдэг. Одоо та нэгтгэх хүсэлтийг үүсгэж, функцийг хэрэглэгчдэд хүргэх хүртэл удаан хүлээх хэрэгтэй.

Энэ замын нэг хэсэг нь Docker дүрсийг бүтээх явдал юм. Заримдаа чуулган хэдэн минут, заримдаа хэдэн арван минут үргэлжилдэг бөгөөд үүнийг хэвийн гэж нэрлэх нь бараг боломжгүй юм. Энэ нийтлэлд бид зураг болгон багцлах энгийн програмыг авч, бүтээх ажлыг хурдасгах хэд хэдэн аргыг хэрэглэж, эдгээр аргууд хэрхэн ажилладаг талаар авч үзэх болно.

Докерын зургийг хэрхэн хурдасгах талаар зарим зөвлөмжүүд. Жишээлбэл, 30 секунд хүртэл

Бидэнд хэвлэл мэдээллийн вэбсайт үүсгэх, дэмжих сайн туршлагатай: TASS, Белл, "Шинэ сонин", Бүгд Найрамдах Улс… Саяхан бид бүтээгдэхүүнийхээ вэб сайтыг гаргаснаар багцаа өргөжүүлсэн Сануулагч. Шинэ боломжуудыг хурдан нэмж, хуучин алдаануудыг зассан ч удаан байршуулах нь том асуудал болсон.

Бид GitLab-д байршуулдаг. Бид зураг цуглуулж, GitLab Бүртгэл рүү түлхэж, үйлдвэрлэлд гаргадаг. Энэ жагсаалтын хамгийн урт зүйл бол зураг цуглуулах явдал юм. Жишээ нь: оновчлолгүй бол backend бүтээх бүр 14 минут зарцуулсан.

Докерын зургийг хэрхэн хурдасгах талаар зарим зөвлөмжүүд. Жишээлбэл, 30 секунд хүртэл

Эцэст нь бид цаашид ингэж амьдрах боломжгүй нь тодорхой болж, яагаад зургуудыг цуглуулахад ийм удаж байгааг ойлгохоор суулаа. Үүний үр дүнд бид угсрах хугацааг 30 секунд хүртэл бууруулж чадсан!

Докерын зургийг хэрхэн хурдасгах талаар зарим зөвлөмжүүд. Жишээлбэл, 30 секунд хүртэл

Энэ нийтлэлийн хувьд Reminder-ийн орчинд холбогдохгүйн тулд хоосон Angular програмыг цуглуулах жишээг харцгаая. Тиймээс, програмаа үүсгэцгээе:

ng n app

Түүнд PWA нэмнэ (бид дэвшилтэт):

ng add @angular/pwa --project app

Сая npm багцыг татаж авах үед докерын дүрс хэрхэн ажилладагийг олж мэдье. Docker нь програмуудыг багцалж, тэдгээрийг контейнер гэж нэрлэгддэг тусгаарлагдсан орчинд ажиллуулах боломжийг олгодог. Тусгаарлалтын ачаар та олон контейнерийг нэг сервер дээр зэрэг ажиллуулах боломжтой. Контейнерууд нь системийн цөм дээр шууд ажилладаг тул виртуал машинуудаас хамаагүй хөнгөн байдаг. Манай програмтай контейнер ажиллуулахын тулд бид эхлээд програмаа ажиллуулахад шаардлагатай бүх зүйлийг багцлах зураг үүсгэх хэрэгтэй. Үндсэндээ зураг нь файлын системийн хуулбар юм. Жишээлбэл, Dockerfile-г ав:

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

Dockerfile нь зааврын багц юм; Тэдгээрийг тус бүрээр хийснээр 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

Барилгын өмнө докер нь одоогийн контекст дэх бүх файлыг авч, өөрийн демон руу илгээдэг 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 MB-ээс хамаагүй дээр. Мөн бид зургийн хэмжээг 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 бол маш жижиг Линукс юм. Уулын нуруунд суурилсан nodej-д зориулсан докерын зураг ердөө 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 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. Энэ тохиолдолд файлуудыг ямар нэгэн байдлаар гаднаас нь өгөх хэрэгтэй. Та nodejs дээр HTTP сервер ажиллуулж болно. Гэхдээ бид үүнийг хөнгөвчлөх болно. Дөрвөн “y” үсэгтэй орос үгийг таагаарай. Зөв! Ynzhynyksy. Nginx-тэй зураг авъя, дотор нь хавтас тавь dist болон жижиг тохиргоо:

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

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

Олон үе шаттай барилга нь энэ бүхнийг хийхэд бидэнд тусална. 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 .

Одоо бидэнд хоёр заавар байна FROM Dockerfile-д тус бүр өөр өөр бүтээх алхамыг ажиллуулдаг. Бид эхнийх рүү залгасан builder, гэхдээ хамгийн сүүлийн FROM-аас эхлэн бидний эцсийн дүр зураг бэлтгэгдэнэ. Сүүлийн алхам бол өмнөх алхам дахь бидний угсралтын олдворыг nginx-ээр эцсийн зураг руу хуулах явдал юм. Зургийн хэмжээ мэдэгдэхүйц багассан:

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

Өөрийн дүрс бүхий савыг ажиллуулж, бүх зүйл ажиллаж байгаа эсэхийг шалгацгаая:

docker run -p8080:80 app

-p8080:80 сонголтыг ашиглан бид хост машин дээрх 8080 портыг nginx ажилладаг контейнер доторх 80-р порт руу шилжүүлсэн. Хөтөч дээр нээх http://localhost:8080/ мөн бид програмаа харж байна. Бүх зүйл ажиллаж байна!

Докерын зургийг хэрхэн хурдасгах талаар зарим зөвлөмжүүд. Жишээлбэл, 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 багц руу шилжүүлнэ.

Докерын зургийг хэрхэн хурдасгах талаар зарим зөвлөмжүүд. Жишээлбэл, 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 багцууд руу түлхэгдэж, дараагийн бүтээцэд кэшийн эх сурвалж болгон ашиглах боломжтой.

Докерын зургийг хэрхэн хурдасгах талаар зарим зөвлөмжүүд. Жишээлбэл, 30 секунд хүртэл

Нийт угсрах хугацааг нэг минут хагас болгон бууруулсан. Өмнөх зургуудыг татахад хагас минут зарцуулдаг.

Урьдчилан дүрслэх

Цэвэр Docker кэштэй холбоотой асуудлыг шийдэх өөр нэг арга бол зарим давхаргыг өөр Dockerfile руу зөөж, тусад нь бүтээж, Контейнерийн бүртгэлд оруулж, эцэг эх болгон ашиглах явдал юм.

Бид Angular програмыг бүтээхийн тулд өөрсдийн nodejs дүрсийг бүтээдэг. Төсөлд 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

Одоо бидний үндсэн Dockerfile дээр бид бэлэн зургийг ашиглаж байна:

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

Бидний жишээн дээр бүтээх хугацаа багасаагүй боловч хэрэв танд олон төсөл байгаа бөгөөд тус бүрдээ ижил хамаарлыг суулгах шаардлагатай бол урьдчилан бүтээсэн зургууд хэрэгтэй болно.

Докерын зургийг хэрхэн хурдасгах талаар зарим зөвлөмжүүд. Жишээлбэл, 30 секунд хүртэл

Бид докерын зургийг бүтээх ажлыг хурдасгах хэд хэдэн аргыг авч үзсэн. Хэрэв та байршуулалтыг хурдан хийхийг хүсвэл үүнийг төсөлдөө ашиглаж үзнэ үү:

  • контекстийг багасгах;
  • эцэг эхийн жижиг зургийг ашиглах;
  • олон үе шаттай угсралт;
  • кэшийг үр ашигтай ашиглахын тулд Dockerfile дахь зааврын дарааллыг өөрчлөх;
  • CI/CD систем дэх кэшийг тохируулах;
  • дүрсийг урьдчилан бүтээх.

Энэ жишээ нь Docker хэрхэн ажилладагийг илүү ойлгомжтой болгож, та байршуулалтаа оновчтойгоор тохируулах боломжтой болно гэж найдаж байна. Өгүүллийн жишээн дээр тоглохын тулд агуулах үүсгэсэн https://github.com/devopsprodigy/test-docker-build.

Эх сурвалж: www.habr.com

сэтгэгдэл нэмэх