டோக்கர் படங்களை எவ்வாறு விரைவாக உருவாக்குவது என்பதற்கான சில குறிப்புகள். உதாரணமாக, 30 வினாடிகள் வரை

ஒரு அம்சம் தயாரிப்பில் இறங்குவதற்கு முன், சிக்கலான ஆர்கெஸ்ட்ரேட்டர்கள் மற்றும் CI/CD உள்ள இந்த நாட்களில், சோதனைகள் மற்றும் டெலிவரிக்கு உறுதியுடன் செல்ல நீண்ட தூரம் உள்ளது. முன்பு, நீங்கள் FTP வழியாக புதிய கோப்புகளைப் பதிவேற்றலாம் (இனி யாரும் அதைச் செய்ய மாட்டார்கள், சரியா?), மேலும் "வரிசைப்படுத்தல்" செயல்முறை சில நொடிகள் எடுத்தது. இப்போது நீங்கள் ஒன்றிணைக்கும் கோரிக்கையை உருவாக்கி, அந்த அம்சம் பயனர்களை அடைய நீண்ட நேரம் காத்திருக்க வேண்டும்.

இந்தப் பாதையின் ஒரு பகுதி டோக்கர் படத்தை உருவாக்குகிறது. சில நேரங்களில் சட்டசபை சில நிமிடங்கள் நீடிக்கும், சில நேரங்களில் பத்து நிமிடங்கள், இது சாதாரணமாக அழைக்கப்படாது. இந்த கட்டுரையில், ஒரு எளிய பயன்பாட்டை நாங்கள் எடுத்துக்கொள்வோம், அதை ஒரு படத்தில் தொகுத்து, உருவாக்கத்தை விரைவுபடுத்த பல முறைகளைப் பயன்படுத்துவோம், மேலும் இந்த முறைகள் எவ்வாறு செயல்படுகின்றன என்பதற்கான நுணுக்கங்களைப் பார்ப்போம்.

டோக்கர் படங்களை எவ்வாறு விரைவாக உருவாக்குவது என்பதற்கான சில குறிப்புகள். உதாரணமாக, 30 வினாடிகள் வரை

ஊடக இணையதளங்களை உருவாக்கி ஆதரிப்பதில் எங்களுக்கு நல்ல அனுபவம் உள்ளது: டாஸ், மணி, "புதிய செய்தித்தாள்", குடியரசு… நீண்ட காலத்திற்கு முன்பு நாங்கள் தயாரிப்பு இணையதளத்தை வெளியிடுவதன் மூலம் எங்கள் போர்ட்ஃபோலியோவை விரிவுபடுத்தினோம் நினைவூட்டல். புதிய அம்சங்கள் விரைவாக சேர்க்கப்பட்டு பழைய பிழைகள் சரி செய்யப்பட்டாலும், மெதுவாக வரிசைப்படுத்துவது ஒரு பெரிய பிரச்சனையாக மாறியது.

நாங்கள் 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 .

படங்களை உருவாக்குவதற்கான சூழல் சரியாக உள்ளமைக்கப்பட்டிருந்தால் (மேலும் கீழே உள்ளவை), பின்னர் உருவாக்கம் தொடங்கும் போது, ​​டோக்கரில் ஏற்கனவே பல தற்காலிக சேமிப்புகள் இருக்கும். தற்காலிக சேமிப்பை எவ்வாறு பயன்படுத்துவது என்பதைக் கற்றுக்கொள்வது எங்கள் பணியாகும், இதனால் உருவாக்கம் முடிந்தவரை விரைவாகச் செல்லும். கேச் இல்லாமல் ஒரு கட்டத்தை இயக்குவது ஒரு முறை மட்டுமே நடக்கும் என்று நாங்கள் கருதுகிறோம் - முதல் முறையாக - முதல் முறை எவ்வளவு மெதுவாக இருந்தது என்பதை நாம் புறக்கணிக்கலாம். சோதனைகளில், தற்காலிக சேமிப்புகள் ஏற்கனவே சூடுபடுத்தப்பட்டு, எங்கள் கேக்கைச் சுடத் தயாராக இருக்கும்போது, ​​உருவாக்கத்தின் இரண்டாவது ஓட்டம் எங்களுக்கு முக்கியமானது. இருப்பினும், சில குறிப்புகள் முதல் கட்டமைப்பையும் பாதிக்கும்.

மேலே விவரிக்கப்பட்ட 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. கட்டமைப்பின் சூழல் உருவாக்க கட்டளைக்கான கடைசி வாதமாக குறிப்பிடப்படுகிறது. எங்கள் விஷயத்தில், இது தற்போதைய கோப்பகம் - ".", - மற்றும் டோக்கர் இந்த கோப்புறையில் உள்ள அனைத்தையும் இழுக்கிறது. 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 MB ஐ விட 409 KB மிகவும் சிறந்தது. படத்தின் அளவை 1.74 இலிருந்து 1.38 ஜிபியாகக் குறைத்தோம்:

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

படத்தின் அளவை மேலும் குறைக்க முயற்சிப்போம்.

நாங்கள் அல்பைனைப் பயன்படுத்துகிறோம்

படத்தின் அளவைச் சேமிப்பதற்கான மற்றொரு வழி, சிறிய பெற்றோர் படத்தைப் பயன்படுத்துவது. பெற்றோர் உருவம் என்பது அதன் அடிப்படையில் நமது படம் தயாரிக்கப்பட்ட படம். கீழ் அடுக்கு கட்டளை மூலம் குறிப்பிடப்படுகிறது FROM Dockerfile இல். எங்கள் விஷயத்தில், ஏற்கனவே nodejகள் நிறுவப்பட்ட உபுண்டு அடிப்படையிலான படத்தைப் பயன்படுத்துகிறோம். மற்றும் அது எடையும் ...

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

... கிட்டத்தட்ட ஒரு ஜிகாபைட். ஆல்பைன் லினக்ஸை அடிப்படையாகக் கொண்ட படத்தைப் பயன்படுத்துவதன் மூலம் அளவைக் கணிசமாகக் குறைக்கலாம். அல்பைன் என்பது மிகச் சிறிய லினக்ஸ். ஆல்பைன் அடிப்படையிலான நோட்ஜ்களுக்கான டோக்கர் படத்தின் எடை 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

பயன்பாட்டை உருவாக்க தேவையான சில விஷயங்களை நாங்கள் நிறுவ வேண்டியிருந்தது. ஆம், பைதான் ¯(°_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 சேவையகத்தை nodejகளில் இயக்கலாம். ஆனால் நாங்கள் அதை எளிதாக்குவோம். "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, ஆனால் கடைசியில் இருந்து தொடங்கி, எங்கள் இறுதிப் படம் தயாராகிவிடும். முந்தைய கட்டத்தில் எங்கள் சட்டசபையின் கலைப்பொருளை nginx உடன் இறுதிப் படத்தில் நகலெடுப்பதே கடைசி படியாகும். படத்தின் அளவு கணிசமாகக் குறைந்துள்ளது:

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

எங்கள் படத்துடன் கொள்கலனை இயக்கி, அனைத்தும் செயல்படுவதை உறுதி செய்வோம்:

docker run -p8080:80 app

-p8080:80 விருப்பத்தைப் பயன்படுத்தி, nginx இயங்கும் கொள்கலனில் உள்ள போர்ட் 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 .

முதலில், pack.json மற்றும் pack-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 தீர்வைப் பயன்படுத்தினால், உள்ளூர் டோக்கர் கேச் சுத்தமாகவும் புதியதாகவும் இருக்கும். வேகவைத்த அடுக்குகளைப் பெற டோக்கருக்கு ஒரு இடத்தைக் கொடுக்க, முந்தைய கட்டமைக்கப்பட்ட படத்தை அவருக்குக் கொடுங்கள்.

கிட்ஹப் செயல்களில் எங்கள் பயன்பாட்டை உருவாக்குவதற்கான உதாரணத்தை எடுத்துக்கொள்வோம். நாங்கள் இந்த அமைப்பைப் பயன்படுத்துகிறோம்

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 வினாடிகளில் படம் ஒன்றுசேர்ந்து கிட்ஹப் தொகுப்புகளுக்குத் தள்ளப்படுகிறது:

டோக்கர் படங்களை எவ்வாறு விரைவாக உருவாக்குவது என்பதற்கான சில குறிப்புகள். உதாரணமாக, 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. உண்மை என்னவென்றால், மல்டிஸ்டேஜ் அசெம்பிளியில் இதன் விளைவாக வரும் படம் கடைசி கட்டத்தில் இருந்து அடுக்குகளின் தொகுப்பாக இருக்கும். இந்த வழக்கில், முந்தைய அடுக்குகளின் அடுக்குகள் படத்தில் சேர்க்கப்படாது. எனவே, முந்தைய உருவாக்கத்தில் இருந்து இறுதிப் படத்தைப் பயன்படுத்தும் போது, ​​nodejs (பில்டர் நிலை) மூலம் படத்தை உருவாக்க டோக்கரால் தயாராக அடுக்குகளைக் கண்டறிய முடியாது. இந்த சிக்கலை தீர்க்க, ஒரு இடைநிலை படம் உருவாக்கப்பட்டது $IMAGE_NAME-builder-stage மற்றும் GitHub தொகுப்புகளுக்குத் தள்ளப்படுகிறது, இதனால் அது ஒரு கேச் ஆதாரமாக அடுத்தடுத்த உருவாக்கத்தில் பயன்படுத்தப்படலாம்.

டோக்கர் படங்களை எவ்வாறு விரைவாக உருவாக்குவது என்பதற்கான சில குறிப்புகள். உதாரணமாக, 30 வினாடிகள் வரை

மொத்த சட்டசபை நேரம் ஒன்றரை நிமிடங்களாக குறைக்கப்பட்டது. முந்தைய படங்களை மேலே இழுக்க அரை நிமிடம் செலவிடப்படுகிறது.

ப்ரீமேஜிங்

சுத்தமான டோக்கர் கேச் சிக்கலைத் தீர்ப்பதற்கான மற்றொரு வழி, சில லேயர்களை மற்றொரு டாக்கர்ஃபைலுக்கு நகர்த்தி, தனித்தனியாக உருவாக்கி, கொள்கலன் பதிவேட்டில் தள்ளி, அதை பெற்றோராகப் பயன்படுத்துவது.

கோண பயன்பாட்டை உருவாக்க எங்களின் சொந்த nodejs படத்தை உருவாக்குகிறோம். திட்டத்தில் 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

இப்போது எங்கள் பிரதான Dockerfile இல் முடிக்கப்பட்ட படத்தைப் பயன்படுத்துகிறோம்:

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

எங்கள் எடுத்துக்காட்டில், உருவாக்க நேரம் குறையவில்லை, ஆனால் உங்களிடம் பல திட்டங்கள் இருந்தால், அவை ஒவ்வொன்றிலும் ஒரே சார்புகளை நிறுவ வேண்டும் என்றால் முன் கட்டப்பட்ட படங்கள் பயனுள்ளதாக இருக்கும்.

டோக்கர் படங்களை எவ்வாறு விரைவாக உருவாக்குவது என்பதற்கான சில குறிப்புகள். உதாரணமாக, 30 வினாடிகள் வரை

டோக்கர் படங்களை உருவாக்குவதை விரைவுபடுத்துவதற்கான பல முறைகளைப் பார்த்தோம். வரிசைப்படுத்தல் விரைவாகச் செல்ல விரும்பினால், உங்கள் திட்டத்தில் இதைப் பயன்படுத்தவும்:

  • சூழலைக் குறைத்தல்;
  • சிறிய பெற்றோர் படங்களைப் பயன்படுத்துதல்;
  • பல கட்ட சட்டசபை;
  • தற்காலிக சேமிப்பை திறம்பட பயன்படுத்த Dockerfile இல் உள்ள வழிமுறைகளின் வரிசையை மாற்றுதல்;
  • CI/CD அமைப்புகளில் தற்காலிக சேமிப்பை அமைத்தல்;
  • படங்களின் ஆரம்ப உருவாக்கம்.

டோக்கர் எவ்வாறு செயல்படுகிறது என்பதை உதாரணம் தெளிவுபடுத்தும் என்று நம்புகிறேன், மேலும் உங்கள் வரிசைப்படுத்தலை நீங்கள் உகந்ததாக உள்ளமைக்க முடியும். கட்டுரையின் எடுத்துக்காட்டுகளுடன் விளையாடுவதற்காக, ஒரு களஞ்சியம் உருவாக்கப்பட்டது https://github.com/devopsprodigy/test-docker-build.

ஆதாரம்: www.habr.com

கருத்தைச் சேர்