Docker Compose build vs image: வித்தியாசம் என்ன?
Docker Compose-ல் image மற்றும் build பயன்பாட்டை அறியுங்கள். Dockerfile மாற்றங்களை ஏன் compose up கண்டுகொள்வதில்லை என்பதற்கான காரணத்தையும், அதை சரிசெய்யும் முறையையும் விளக்குகிறோம்.
Docker Compose build மற்றும் image: சுருக்கமான விளக்கம்
ஒரு Docker Compose கோப்பில், image: என்பது registry-யிலிருந்து பதிவிறக்கம் செய்ய வேண்டிய image-ன் பெயரைக் குறிக்கிறது. build: என்பது இந்த கணினியில் உள்ள Dockerfile-ஐப் பயன்படுத்தி ஒரு image-ஐ உருவாக்க Compose-க்கு ஆணையிடுகிறது. image:-ஐ மட்டும் அமைத்தால், Compose அந்த குறிப்பிட்ட tag-ஐ பதிவிறக்கம் செய்து இயக்கும். build:-ஐ மட்டும் அமைத்தால், Compose உள்ளூர் கணினியில் image-ஐ உருவாக்கும்; அதற்கு project பெயர் மற்றும் service பெயரைக் கொண்டு ஒரு பெயரை வழங்கும். இரண்டையும் அமைத்தால், Compose உள்ளூரில் image-ஐ உருவாக்கி, அதை image:-ல் உள்ள பெயரில் tag செய்யும். நீங்கள் ஒரு image-ஐ உருவாக்கி, உங்களுக்கு விருப்பமான பெயரில் push செய்ய இதுவே வழி.
இதுவே இரண்டிற்கும் உள்ள அடிப்படை வேறுபாடு. கீழே உள்ளவை அனைத்தும் ஒரு server-ல் இது எவ்வாறு செயல்படுகிறது என்பதற்கான விளக்கமாகும். Docker Engine மற்றும் Compose plugin ஏற்கனவே நிறுவப்பட்டிருப்பதாக இது கருதுகிறது; VPS-ல் Docker-ஐ இயக்குதல் என்ற பகுதி அதை விளக்குகிறது.
மூன்று வடிவங்கள் முழுமையாக
வெளியிடப்பட்ட ஒரு tag-ஐ pull செய்து இயக்கவும். இதில் எந்த இடத்திலும் Dockerfile பயன்படுத்தப்படுவதில்லை.
services:
web:
image: nginx:1.27
restart: unless-stopped
ports:
- "80:80"தற்போதைய கோப்பகத்தில் (directory) உள்ள Dockerfile-லிருந்து build செய்யவும். FROM-ல் குறிப்பிடப்பட்டுள்ள base image-ஐத் தவிர வேறு எதுவும் pull செய்யப்படாது.
services:
web:
build: .
restart: unless-stopped
ports:
- "80:80"உள்ளூர் அளவில் build செய்து, அந்த முடிவிற்கு tag இடவும். docker compose push மூலம் அந்த குறிப்பிட்ட tag-ஐ ஒரு registry-க்கு அனுப்ப முடியும்.
services:
web:
build:
context: .
dockerfile: Dockerfile
image: registry.example.com/acme/web:1.4.2
restart: unless-stopped
ports:
- "80:80"context என்பது builder-க்கு அனுப்பப்படும் கோப்பகம் ஆகும். dockerfile அந்த context-ஐ அடிப்படையாகக் கொண்டே தீர்மானிக்கப்படுகிறது, எனவே context: . உடன் dockerfile: docker/prod.Dockerfile-ஐப் பயன்படுத்துவது இயல்பானதும் சரியானதுமாகும். ஒவ்வொரு service container-க்கு பின்னால் உள்ள image பெயர் மற்றும் image ID-ஐப் பார்க்க docker compose images-ஐ இயக்கவும்; நீங்கள் உண்மையில் எந்த வடிவத்தை எழுதினீர்கள் என்பதை உறுதிப்படுத்த இதுவே வேகமான வழியாகும்.
Dockerfile-ஐ மாற்றிய பிறகு ஏன் docker compose up கட்டளை rebuild செய்வதில்லை?
ஏனெனில் up, image தற்போதைய நிலையில் உள்ளதா என்று பார்க்காமல், அது ஏற்கனவே உள்ளதா என்று மட்டுமே சரிபார்க்கிறது.
Compose ஒரு service-ஐத் தொடங்கும்போது, அதில் build: பகுதி இருந்தால், அது உள்ளூர் image store-ல் அந்த image-ஐத் தேடும். அந்தப் பெயரில் ஏற்கனவே ஒரு image இருந்தால், Compose அதையே பயன்படுத்தும். அது உங்கள் Dockerfile-ஐப் படிப்பதோ, source files-ஐ ஒப்பிடுவதோ அல்லது timestamp-ஐப் பார்ப்பதோ இல்லை. Compose விவரக்குறிப்பு இந்த விதியை pull_policy பண்பாகக் குறிப்பிடுகிறது, மேலும் இயல்பான நடத்தை (default behaviour) என்னவென்றால், image விடுபட்டிருந்தால் மட்டுமே அது build செய்யப்படும். ஏற்கனவே இருப்பது போதுமானதாகக் கருதப்படுகிறது.
எனவே, நீங்கள் app.py-ஐத் திருத்திவிட்டு, docker compose up -d-ஐ இயக்கினால், Compose அந்த container இயங்குவதாகக் காட்டும், ஆனால் பழைய code-ஐயே அது வழங்கும். எந்தப் பிழையும் ஏற்படாததால், எந்த எச்சரிக்கையும் வராது. Compose-ல் "எனது மாற்றம் நடைமுறைக்கு வரவில்லை" என்று வரும் புகார்களில் இதுவே மிகவும் பொதுவானது. container பெயருக்கு அருகில் Compose அச்சிடும் status வார்த்தையே இதற்கான அடையாளம்: Compose மாற்றியமைத்த container 'recreated' அல்லது 'started' என்று காட்டும், அதேசமயம் Compose எதையும் செய்யாமல் விட்டுவிட்ட container 'running' என்று காட்டும்.
இரண்டு சோதனைகள் மூலம் இதை உறுதிப்படுத்தலாம். docker compose images ஒவ்வொரு container-ம் பயன்படுத்தும் image ID-ஐ அச்சிடும், எனவே deploy செய்வதற்கு முன் அதைக் குறித்துக்கொண்டு, பிறகு ஒப்பிட்டுப் பார்க்கவும். docker image ls-ல் CREATED நெடுவரிசை உள்ளது; உங்கள் கடைசி commit-க்கு முன்பு உருவாக்கப்பட்ட image, deploy script என்ன சொன்னாலும் அது பழைய (stale) image தான்.
எந்தெந்த flags rebuild-ஐ கட்டாயப்படுத்துகின்றன
docker compose up -d --buildமுதலில் build செய்து, பின்பு image மாறிய எந்தவொரு container-ஐயும் மீண்டும் உருவாக்குகிறது. பெரும்பாலான பயனர்கள் தேடும் flag இதுவே.docker compose build webஒரு service-ஐ மட்டும் build செய்யும், எதையும் தொடங்காது. அந்த container-ஐ மட்டும் மாற்றிவிட்டு, மற்ற stack-ஐ தொடர்ந்து இயங்க வைக்க, இதைத் தொடர்ந்துdocker compose up --no-deps -d web-ஐப் பயன்படுத்தவும்.docker compose build --no-cache webஅனைத்து cached layer-களையும் நீக்கிவிட்டு, முதல் instruction-லிருந்து rebuild செய்யும்.docker compose build --pullFROM-ல் உள்ள base image-ன் புதிய பதிப்பைப் பதிவிறக்க முயற்சிக்கும். எனவே,node:22போன்ற மாறும் tag-கள், நீங்கள் மார்ச் மாதம் பதிவிறக்கிய நகலுக்குப் பதிலாக அதன் தற்போதைய உள்ளடக்கத்தைப் பெறும்.docker compose up -d --force-recreateஏற்கனவே பயன்படுத்தும் image-லிருந்து container-களை மீண்டும் உருவாக்கும். இது ஒருபோதும் build செய்யாது.--build-க்கு பதிலாக இதைத் தேர்ந்தெடுப்பது ஒரு பொதுவான தவறான அணுகுமுறையாகும்.
இந்த முடிவை நீங்கள் கோப்பிற்குள்ளேயே மாற்றலாம். Compose specification-ன் படி, pull_policy: build என்பது Compose அந்த image-ஐ build செய்யும் என்பதையும், ஏற்கனவே இருந்தால் அதை rebuild செய்யும் என்பதையும் குறிக்கிறது. ஒவ்வொரு up-ம் build-க்கான நேரத்தை எடுத்துக்கொள்ளும்; இது லேப்டாப்பில் தேவைப்படலாம், ஆனால் server-ல் அரிதாகவே தேவைப்படும்.
services:
web:
build: .
image: registry.example.com/acme/web:dev
pull_policy: buildமேலும் ஒரு செயல்பாட்டைத் தெரிந்துகொள்வது அவசியம். docker compose pull என்பது build பகுதியைக் கொண்ட service-களுக்கான image-களைப் பதிவிறக்க முயற்சிக்கும். அந்தப் பதிவிறக்கம் தோல்வியுற்றால், அந்த image-ஐ build செய்ய வேண்டும் என்று அது உங்களுக்குத் தெரிவிக்கும். அத்தகைய service-களைத் தவிர்க்க --ignore-buildable-ஐப் பயன்படுத்தவும்.
Build cache உங்கள் deploy நேரத்தை எவ்வாறு தீர்மானிக்கிறது
Dockerfile-ல் உள்ள ஒவ்வொரு instruction-ம் ஒரு layer-ஐ உருவாக்குகிறது. அந்த instruction மற்றும் அதன் உள்ளீடுகள் மாறாமல் இருக்கும்போது, builder ஏற்கனவே உள்ள cached layer-ஐ மீண்டும் பயன்படுத்துகிறது. COPY-க்கு, நகலெடுக்கப்படும் கோப்புகளின் உள்ளடக்கங்களே உள்ளீடுகளாகும். ஒரு layer cache-ல் கிடைக்கவில்லை என்றால், அதற்குப் பிறகு வரும் அனைத்து layer-களும் மீண்டும் உருவாக்கப்படும். ஏனெனில், ஒவ்வொரு layer-ம் அதற்கு முந்தைய layer உருவாக்கிய filesystem-ன் மேலேயே கட்டமைக்கப்படுகிறது.
இந்த ஒரு விதிதான் உங்கள் deploy சில வினாடிகளில் முடியுமா அல்லது பல நிமிடங்கள் ஆகுமா என்பதைத் தீர்மானிக்கிறது. அரிதாக மாறும் விஷயங்களிலிருந்து தொடங்கி, ஒவ்வொரு commit-லும் மாறும் விஷயங்கள் வரை Dockerfile-ஐ வரிசைப்படுத்துங்கள்.
FROM node:22-slim
WORKDIR /app
COPY package.json package-lock.json ./
RUN npm ci
COPY . .
CMD ["node", "server.js"]npm ci, COPY . .-க்கு மேலே இருப்பதால், ஒரு source file-ஐ மாற்றும்போது install layer cache-லேயே இருக்கும், மேலும் build செயல்முறை copy படியிலிருந்து தொடரும். இந்த இரண்டு வரிகளையும் மாற்றினால், ஒரு சிறிய எழுத்து மாற்றமும் அனைத்து dependency-களையும் மீண்டும் install செய்ய வைக்கும். ஏனெனில், COPY . ., npm ci கட்டமைக்கப்பட்டுள்ள layer-ஐ செல்லாததாக்கிவிடும். இதே தர்க்கம் pip install -r requirements.txt மற்றும் go mod download-க்கும் பொருந்தும்.
உங்கள் திருத்தத்தை ஒரு பழைய layer மறைத்து வைத்திருப்பதாக நீங்கள் சந்தேகிக்கும்போது --no-cache சரியான கருவியாகும். ஆனால், இதை இயல்பான அமைப்பாக (default) வைத்திருப்பது தவறு. ஏனெனில், Dockerfile வரிசைப்படுத்துவதன் மூலம் பெறப்படும் cache பயன்பாட்டை இது முழுமையாகத் தவிர்த்துவிடும்.
Image-ல் அமைக்கப்பட்டு, Compose மூலம் மாற்றியமைக்கக்கூடிய ஒரு விஷயம் இது: Dockerfile-ன் CMD என்பது image இயல்பாக இயக்கும் கட்டளையாகும், மேலும் service-ல் உள்ள command: key அதை மாற்றியமைக்கும். Command மற்றும் entrypoint எவ்வாறு தொடர்பு கொள்கின்றன என்பது இங்கே முக்கியமானது. ஏனெனில், ஒரு Compose override மூலம் புதிதாக build செய்யப்பட்ட image-ஐ பழைய image போலவே செயல்பட வைக்க முடியும்.
Build context மற்றும் .dockerignore
context: . என்பது அந்த directory-ஐ தொகுத்து, முதல் instruction இயங்குவதற்கு முன்பே builder-க்கு அனுப்புவதைக் குறிக்கிறது. .git மற்றும் உங்கள் source code-க்கு அருகில் நீங்கள் வைத்திருக்கும் எந்தவொரு தரவு directory-யும் உட்பட, அதன் கீழ் உள்ள அனைத்தும் அனுப்பப்படும். மாற்றமில்லாத ஒரு project-ன் "transferring context" நிலையில் build நின்றுவிட்டால், context அளவு மிக அதிகமாக உள்ளது என்று அர்த்தம்.
Context-ன் root-ல் உள்ள ஒரு .dockerignore கோப்பு, குறிப்பிட்ட பாதைகளை அந்தப் பரிமாற்றத்திலிருந்து விலக்குகிறது. இதன் syntax .gitignore-ஐப் போன்றது.
.git
node_modules
*.log
data/
.envஇதனால் இரண்டு நன்மைகள் உள்ளன. பரிமாற்ற அளவு குறைவதால், ஒவ்வொரு build-ம் வேகமாகத் தொடங்கும். மேலும், COPY . .-ஆல் இனி .env-ஐ image-க்குள் நகலெடுக்க முடியாது; அவ்வாறு நகலெடுத்தால், அந்த image-ஐப் பதிவிறக்கும் எவரும் அதை எளிதாகப் படிக்க முடியும்.
காலப்போக்கில் build வேகம் குறைவதற்கு bind mount ஒரு முக்கிய காரணம். Named volume உங்கள் project directory-க்கு வெளியே இருக்கும், ஆனால் ./data:/var/lib/postgresql/data போன்ற bind mount உங்கள் build context-க்கு உள்ளேயே இருக்கும். இதனால் database வளர வளர, ஒவ்வொரு வாரமும் உங்கள் build வேகம் குறையும். .dockerignore-ல் ஒரே ஒரு வரியைச் சேர்ப்பதன் மூலம் இதைச் சரிசெய்யலாம். Bind mounts against named volumes பகுதி இது குறித்த விரிவான ஒப்பீட்டை வழங்குகிறது.
Build arguments-ல் இதே போன்ற சிறிய ஆபத்து உள்ளது. args: வழியாக அனுப்பப்படும் மதிப்புகள், image-ஐ வைத்திருக்கும் எவருக்கும் அதன் history-ல் தெரியும். எனவே, அங்கு version number-ஐ மட்டும் குறிப்பிடவும், ஒருபோதும் token-களைப் பயன்படுத்த வேண்டாம். Env files and secrets in Compose பகுதி, credentials-ஐ எங்கு வைக்க வேண்டும் என்பதை விளக்குகிறது.
VPS-ல் build செய்வதா அல்லது பிற இடங்களில் build செய்து pull செய்வதா?
உங்கள் traffic-ஐக் கையாளும் server-லேயே build செய்வது இயல்பான முறை, ஏனெனில் இதுவே மிகக் குறுகிய வழி: git pull, பிறகு docker compose up -d --build. யாரும் சார்ந்திருக்காத சிறிய server-களில் இது சரியாக இருக்கும். ஆனால், அளவிடக்கூடிய இரண்டு காரணங்களாலும், ஒரு மோசமான சூழலில் மட்டும் வெளிப்படும் ஒரு காரணத்தாலும் இது தவிர்க்கப்பட வேண்டும்.
Memory. ஒரு build செயல்முறை, உங்கள் live application-க்கு அருகிலேயே compilers மற்றும் bundlers-ஐ இயக்குகிறது. இவை பெரும்பாலான stack-களில் அதிக memory-ஐப் பயன்படுத்தும் பகுதிகள். 1 GB VPS-ல், ஒரு JavaScript bundler அல்லது Rust compile செயல்முறை வழக்கமாக அந்த server-ன் மிகப்பெரிய process-ஆக இருக்கும். Kernel-க்கு memory பற்றாக்குறை ஏற்படும்போது, அது மிகப்பெரிய process-ஐக் கொல்லும்: ஒன்று build செயல்முறை Killed மற்றும் exit status 137-உடன் நின்றுவிடும், அல்லது உங்கள் database கொல்லப்பட்டு deploy நடக்கும்போதே தளம் முடங்கிவிடும். dmesg -T | grep -i oom கட்டளை, கொல்லப்பட்ட process-ன் பெயருடன் அந்த வரியைக் காட்டும்; எனவே எதனால் பாதிப்பு ஏற்பட்டது என்பதை ஊகிக்காமல் உறுதிப்படுத்தலாம்.
Disk. ஒவ்வொரு build-ம் சில layers-ஐ விட்டுச் செல்கிறது, மேலும் builder உங்கள் images-லிருந்து தனித்தனியாக அதன் cache-ஐப் பராமரிக்கிறது. docker system df இரண்டையும் காட்டும், build cache வரிசை தொடர்ந்து வளர்ந்துகொண்டே இருக்கும். தேவையற்ற images-ஐ நீக்க docker image prune கட்டளையையும், cache செய்யப்பட்ட layers-ஐ நீக்க docker builder prune கட்டளையையும் பயன்படுத்தவும். Disk முழுமையாக நிரம்பினால் build மட்டும் நிற்காது. Database-ம் எழுதுவதை நிறுத்திவிடும், இந்தத் தோல்வி மெதுவான deploy-ஐ விட அதிக இழப்பை ஏற்படுத்தும்.
Reproducibility. server-ல் build செய்யப்படும் ஒரு image அந்த server-ல் மட்டுமே இருக்கும். Rollback செய்ய வேண்டுமெனில், பழைய commit-ஐ எடுத்து மீண்டும் build செய்ய வேண்டும். ஆனால், base tag மாறியிருக்கலாம் அல்லது package mirrors மாறியிருக்கலாம் என்பதால், அதே output கிடைக்கும் என்பதற்கு உத்தரவாதம் இல்லை. பிற இடங்களில் build செய்து ஒரு tag-ஐ push செய்வது, rollback-ஐ ஒரு எளிய மாற்றமாக மாற்றும்: image:-ஐ முந்தைய tag-க்கு மாற்றி, docker compose up -d-ஐ இயக்கினால் போதும்.
சரியான அணுகுமுறை தெளிவானது. உங்கள் continuous integration முறையில் build-ஐ இயக்கி registry.example.com/acme/web:<git-sha>-ஐ push செய்யவும், VPS-ல் உள்ள Compose file-ல் image:-ஐ மட்டும் வைத்திருக்கவும், build: key-ஐ நீக்கிவிடவும். இப்போது deployment என்பது மிகக் குறைந்த memory தேவைப்படும் இரண்டு கட்டளைகள் மட்டுமே.
docker compose pull
docker compose up -dserver-ல் ஒருமுறை docker login registry.example.com-ஐ இயக்கினால், அதன் பிறகு Compose-ஆல் private tags-ஐ pull செய்ய முடியும்.
Build பகுதியை நீக்குவதற்குப் பதிலாக, நீங்கள் பெயரிடும் ஒரு தனி file-ல் வைத்து development-க்காகப் பயன்படுத்தவும்.
# compose.dev.yaml
services:
web:
build:
context: .
pull_policy: builddocker compose -f compose.yaml -f compose.dev.yaml up -d --buildஅந்த file-க்கு compose.dev.yaml என்று பெயரிடவும், compose.override.yaml என்று பெயரிட வேண்டாம். Compose ஒரு override file-ஐக் கண்டால் தானாகவே அதை load செய்யும்; எனவே தவறுதலாக ஒரு override file server-க்கு நகர்த்தப்பட்டால், அது மீண்டும் server-லேயே build செய்யத் தொடங்கிவிடும். பல Compose file-களை அடுக்குதல் பகுதியில், key-கள் எவ்வாறு ஒன்றிணைக்கப்படுகின்றன என்பது விளக்கப்பட்டுள்ளது.
பிற இடங்களில் உருவாக்கும்போது ஏற்படும் architecture சிக்கல்
ஒரு image, அது உருவாக்கப்பட்ட CPU architecture-ஐயே கொண்டிருக்கும். Apple Silicon laptop-ல் உருவாக்கி, push செய்து, பின்னர் அந்த tag-ஐ x86_64 VPS-ல் pull செய்தால், கோரப்பட்ட image platform-க்கும் கண்டறியப்பட்ட host platform-க்கும் பொருத்தம் இல்லை என்று Docker எச்சரிக்கும். இந்தச் செயல்முறை exec format error பிழையுடன் நின்றுவிடும்; இது binary சிதைந்திருப்பதாகத் தோன்றினாலும், உண்மையில் அது அவ்வாறு இல்லை. இலக்கு architecture-க்காக நேரடியாக build செய்யவும்:
docker buildx build --platform linux/amd64 \
-t registry.example.com/acme/web:1.4.2 --push .உங்கள் laptop x86 ஆக இருந்து, நீங்கள் x86-க்கு பதிலாக ARM VPS-ல் இயக்கினால், இதே பொருத்தமின்மை தலைகீழாக நிகழும். நீங்கள் deploy செய்யும் அதே architecture-ல் CI-ஐ build செய்ய அனுமதிப்பது, இந்தச் சிக்கலை நீக்கிவிடும்.
Deploy செய்த பிறகு சரிபார்க்க வேண்டியவை
docker compose imagesஇயங்கிக்கொண்டிருக்கும் ஒவ்வொரு container-ன் பின்னால் உள்ள image மற்றும் tag-ஐக் காட்டும். மாறியுள்ள image ID, புதிய build பயன்பாட்டில் இருப்பதற்கான சான்றாகும்.docker compose configvariable substitution செய்யப்பட்ட பிறகுள்ள merged file-ஐக் காட்டும். எனவே, எதையும் இயக்கும் முன்பே Compose பயன்படுத்தப்போகும் இறுதி image பெயரை உங்களால் படிக்க முடியும்.docker compose logs -f webswap செய்த பிறகு முதல் அரை நிமிடத்திற்கு இதைப் பயன்படுத்தவும். தொடங்கும் மற்றும் வெளியேறும் (starts and exits) ஒரு container, இயங்கிக்கொண்டிருக்காமல் மீண்டும் மீண்டும் restart ஆகும். நீங்கள் கவனிக்காவிட்டால் இந்த loop அமைதியாகவே இருக்கும்.docker image lsCREATED என்ற column-ஐக் காட்டும். உங்கள் கடைசி commit-ஐ விட பழைய image என்றால், அது மீண்டும் build செய்யப்படவில்லை என்று அர்த்தம்.
இந்தச் சோதனைகளைச் செய்யும் கோப்பை நீங்கள் இன்னும் உருவாக்கிக்கொண்டிருக்கிறீர்கள் என்றால், VPS-ல் Compose கோப்பின் அடிப்படைகள் பகுதியில் அதற்கான முக்கிய அம்சங்கள் உள்ளன. மேலும், Compose கட்டளைகளின் சுருக்கக் குறிப்பு பகுதியில் மீதமுள்ள subcommands பட்டியலிடப்பட்டுள்ளன.
FAQ
ஒரே service-ல் build மற்றும் image ஆகிய இரண்டையும் பயன்படுத்தலாமா?
ஆம், நீங்கள் சொந்தமாக உருவாக்கும் ஒரு project-க்கு இதுவே வழக்கமான அமைப்பாகும். build: பகுதியில் உள்ளவற்றை வைத்து Compose build செய்கிறது, மேலும் அதன் முடிவை image:-ன் மதிப்பைக் கொண்டு tag செய்கிறது. அந்த tag-ஐத்தான் docker compose push ஒரு registry-க்கு அனுப்புகிறது, அதைத்தான் மற்றொரு machine pull செய்கிறது. image: key இல்லையென்றாலும் Compose build செய்யும், ஆனால் அது project மற்றும் service-ன் பெயரையே image-க்கு வைக்கும். மேலும், அந்த attribute விடுபட்டிருப்பதால் image-ஐ push செய்ய முடியாது என்று எச்சரிக்கும்.
ஏன் docker compose up எனது Dockerfile மாற்றங்களை எடுத்துக்கொள்வதில்லை?
ஏனெனில், up அந்தப் பெயரில் image உள்ளதா என்று மட்டுமே சரிபார்க்கும். ஒரு image ஏற்கனவே இருந்தால், Compose அதைத் தொடங்கிவிடும்; அது உங்கள் Dockerfile அல்லது source files-உடன் ஒப்பிட்டுப் பார்க்காது. docker compose up -d --build-ஐ இயக்கவும், அல்லது ஒரு குறிப்பிட்ட service-ஐ மட்டும் மாற்ற docker compose build web-ஐத் தொடர்ந்து docker compose up --no-deps -d web-ஐ இயக்கவும். ஒரு service-ல் pull_policy: build-ஐ அமைத்தால், ஒவ்வொரு up-ம் மீண்டும் build செய்யப்படும்; இது development machine-க்கு ஏற்றது.
--build மற்றும் --force-recreate ஆகியவற்றுக்கு என்ன வித்தியாசம்?
--build image-ஐ மீண்டும் build செய்யும், பிறகு மாறிய image-ஐக் கொண்ட containers-ஐ மீண்டும் உருவாக்கும். --force-recreate ஏற்கனவே உள்ள image-லிருந்து containers-ஐ மீண்டும் உருவாக்கும், எனவே இது code மாற்றங்களை ஒருபோதும் எடுத்துக்கொள்ளாது. உங்கள் மாற்றம் source-ல் அல்லது Dockerfile-ல் இருந்தால், நீங்கள் பயன்படுத்த வேண்டிய flag --build ஆகும். --force-recreate என்பது container-ஐயே reset செய்யப் பயன்படுகிறது; உதாரணமாக, அதே image-ஐ வைத்துக்கொண்டு அதன் writable layer-ஐ மட்டும் நீக்க இது உதவும்.
எனது Docker images-ஐ VPS-ல் build செய்ய வேண்டுமா அல்லது வேறு எங்காவது செய்ய வேண்டுமா?
வேறு இடத்தில் build செய்துவிட்டு, server traffic-ஐக் கையாளத் தொடங்கியதும் ஒரு tag-ஐ pull செய்யவும். ஒரு build செயல்முறை உங்கள் application-ன் memory-க்காகப் போட்டியிடும். ஒரு சிறிய VPS-ல், kernel அதிக memory-ஐப் பயன்படுத்தும் process-ஐ (அது build-ஆகவோ அல்லது database-ஆகவோ இருக்கலாம்) நீக்கிவிடும். மேலும், build செய்யும்போது disk-ல் சேரும் cache-ஐ யாரும் தானாக நீக்க மாட்டார்கள். பயனர்கள் இல்லாத சிறிய project-களுக்கு server-ல் build செய்வது சரிதான். பிற்காலத்தில் மாற்றிக்கொள்வது எளிது, அதற்கு build: பகுதியை development-க்கு மட்டுமேயான Compose file-ல் வைத்திருங்கள்.
Docker build cache எனது disk-ஐ நிரப்புவதைத் தடுப்பது எப்படி?
உங்கள் images மற்றும் build cache எவ்வளவு இடத்தை ஆக்கிரமித்துள்ளன என்பதைப் பார்க்க docker system df-ஐ இயக்கவும். docker builder prune cached layers-ஐ நீக்கும், docker image prune பழைய build-களால் எஞ்சியிருக்கும் dangling images-ஐ நீக்கும். இவை இரண்டிலும் -a-ஐச் சேர்த்தால் அது இன்னும் தீவிரமாகச் செயல்படும், மேலும் உங்கள் அடுத்த build-ஐ ஆரம்பத்திலிருந்தே (cold) செய்ய வைக்கும். server-ல் docker system prune -af --volumes-ஐ schedule செய்ய வேண்டாம், ஏனெனில் --volumes எந்த container-உம் பயன்படுத்தாத அனைத்து volumes-ஐயும் நீக்கிவிடும். பராமரிப்புக்காக நீங்கள் நிறுத்தி வைத்துள்ள stack-ன் database அத்தகைய volume-ல் இருக்கலாம்.