Онцлогыг үйлдвэрлэлд оруулахаас өмнө нарийн төвөгтэй найрал хөгжимчид болон CI/CD хөгжсөн өнөө үед амлалтаас эхлээд туршилт, хүргэлт хүртэл урт замыг туулах ёстой. Өмнө нь та шинэ файлуудыг FTP-ээр дамжуулан байршуулж болох байсан (хэн ч үүнийг хийхгүй, тийм ээ?), "байршуулах" үйл явц хэдхэн секунд үргэлжилдэг. Одоо та нэгтгэх хүсэлтийг үүсгэж, функцийг хэрэглэгчдэд хүргэх хүртэл удаан хүлээх хэрэгтэй.
Энэ замын нэг хэсэг нь Docker дүрсийг бүтээх явдал юм. Заримдаа чуулган хэдэн минут, заримдаа хэдэн арван минут үргэлжилдэг бөгөөд үүнийг хэвийн гэж нэрлэх нь бараг боломжгүй юм. Энэ нийтлэлд бид зураг болгон багцлах энгийн програмыг авч, бүтээх ажлыг хурдасгах хэд хэдэн аргыг хэрэглэж, эдгээр аргууд хэрхэн ажилладаг талаар авч үзэх болно.
Бидэнд хэвлэл мэдээллийн вэбсайт үүсгэх, дэмжих сайн туршлагатай:
Бид GitLab-д байршуулдаг. Бид зураг цуглуулж, GitLab Бүртгэл рүү түлхэж, үйлдвэрлэлд гаргадаг. Энэ жагсаалтын хамгийн урт зүйл бол зураг цуглуулах явдал юм. Жишээ нь: оновчлолгүй бол backend бүтээх бүр 14 минут зарцуулсан.
Эцэст нь бид цаашид ингэж амьдрах боломжгүй нь тодорхой болж, яагаад зургуудыг цуглуулахад ийм удаж байгааг ойлгохоор суулаа. Үүний үр дүнд бид угсрах хугацааг 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 файлын системд оруулсан өөрчлөлтийг хадгалж, өмнөх өөрчлөлтүүд дээр давхарлана. Баг бүр өөр өөрийн давхарга үүсгэдэг. Мөн бэлэн зураг нь давхаргыг нэгтгэсэн давхарга юм.
Мэдэх нь чухал: Докерын давхарга бүр кэш хийх боломжтой. Хэрэв сүүлийн бүтээцээс хойш юу ч өөрчлөгдөөгүй бол командыг гүйцэтгэхийн оронд докер нь бэлэн давхарга авах болно. Бүтээлийн хурдны гол өсөлт нь кэш ашиглахтай холбоотой байх тул бүтээх хурдыг хэмжихдээ бид бэлэн кэшээр зураг бүтээхэд онцгой анхаарал хандуулах болно. Тиймээс, алхам алхмаар:
- Өмнөх гүйлтүүд туршилтанд нөлөөлөхгүйн тулд бид зургийг дотооддоо устгадаг.
docker rmi $(docker images -q)
- Бид бүтээн байгуулалтыг анх удаа эхлүүлж байна.
time docker build -t app .
- Бид src/index.html файлыг өөрчилдөг - бид програмистын ажлыг дуурайдаг.
- Бид барилгын ажлыг хоёр дахь удаагаа хийж байна.
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-р порт руу шилжүүлсэн. Хөтөч дээр нээх
Зургийн хэмжээг 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 багц руу шилжүүлнэ.
Одоо өмнөх бүтээгдсэн зургууд дээр тулгуурлан кэш ашиглахын тулд бүтцийг өөрчилье:
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 кэштэй холбоотой асуудлыг шийдэх өөр нэг арга бол зарим давхаргыг өөр 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
...
Бидний жишээн дээр бүтээх хугацаа багасаагүй боловч хэрэв танд олон төсөл байгаа бөгөөд тус бүрдээ ижил хамаарлыг суулгах шаардлагатай бол урьдчилан бүтээсэн зургууд хэрэгтэй болно.
Бид докерын зургийг бүтээх ажлыг хурдасгах хэд хэдэн аргыг авч үзсэн. Хэрэв та байршуулалтыг хурдан хийхийг хүсвэл үүнийг төсөлдөө ашиглаж үзнэ үү:
- контекстийг багасгах;
- эцэг эхийн жижиг зургийг ашиглах;
- олон үе шаттай угсралт;
- кэшийг үр ашигтай ашиглахын тулд Dockerfile дахь зааврын дарааллыг өөрчлөх;
- CI/CD систем дэх кэшийг тохируулах;
- дүрсийг урьдчилан бүтээх.
Энэ жишээ нь Docker хэрхэн ажилладагийг илүү ойлгомжтой болгож, та байршуулалтаа оновчтойгоор тохируулах боломжтой болно гэж найдаж байна. Өгүүллийн жишээн дээр тоглохын тулд агуулах үүсгэсэн
Эх сурвалж: www.habr.com