Docker Compose பல கோப்புகளை merge செய்வது எப்படி?
compose.override.yaml தனியாக load ஆகும் விதம், file order-ன் உண்மையான merge, port திறந்தே இருக்கும் ports trap, dev மற்றும் prod பிரிப்புக்கான include ஆகியவற்றை அறிக.
ஒன்றுக்கும் மேற்பட்ட கோப்புகளுடன் Compose செயல்படும் விதம்
Docker Compose பல கோப்புகளிலிருந்து ஒரு project-ஐ உருவாக்க முடியும். அது பெறும் வரிசையில் கோப்புகளைப் படித்து, அவற்றை ஒரே model-ஆக இணைக்கிறது. எனவே முரண்படும் எந்த மதிப்பிலும் பின்னர் வரும் கோப்பின் மதிப்பே பயன்படுத்தப்படும். இதை command line-இலிருந்து செய்ய இரண்டு mechanisms உள்ளன: Compose தானாக ஏற்றும் override file மற்றும் நீங்கள் கைமுறையாகக் குறிப்பிடும் -f flag. மூன்றாவது mechanism கோப்புக்குள்ளேயே இருக்கும் include element ஆகும். இது மற்ற இரண்டிலிருந்தும் வேறுபட்டு செயல்படுகிறது.
இந்த merge வெறும் overwrite அல்ல. Mappings ஒவ்வொரு key அடிப்படையிலும் merge செய்யப்படும். Sequences இணைக்கப்படும். குறைந்த எண்ணிக்கையிலான fields முழுமையாக மாற்றப்படும். இந்த வேறுபாடுதான் எதிர்பாராத விளைவுகளை ஏற்படுத்துகிறது. ports list பெரும்பாலானவர்களுக்கு சிக்கலை ஏற்படுத்தும் பகுதியாகும்.
கீழே உள்ள அனைத்தும் பழைய docker-compose script-க்கு பதிலாக Compose v2-இன் docker compose plugin-ஐக் கருதுகின்றன. சரிபார்க்க docker compose version-ஐ இயக்கவும். நீங்கள் இன்னும் Compose file எழுதவில்லை என்றால், Docker Compose அடிப்படைகள் வழிகாட்டியில் தொடங்கி, பின்னர் இங்கு திரும்பவும்.
Compose தானாக load செய்யும் override file
-f flag இல்லாமல் docker compose up-ஐ இயக்கினால், Compose working directory-யிலும் அதன் parent directories-லிலும் compose.yaml அல்லது docker-compose.yaml கோப்புகளைத் தேடும். Base file-க்கு அடுத்ததாக override file இருந்தால், Compose அதைத் தானாகவே இரண்டாவதாக load செய்யும்.
ls compose.yaml compose.override.yaml
docker compose up -dஇரண்டு கோப்புகளும் இருந்தால், அவற்றை கைமுறையாக வரிசைப்படுத்தி உள்ளிடுவதற்குச் சமம்.
docker compose -f compose.yaml -f compose.override.yaml up -dCompose அங்கீகரிக்கும் பெயர்கள் compose.override.yaml, compose.override.yml, மேலும் பழைய docker-compose.override.yml மற்றும் docker-compose.override.yaml ஆகும். compose.dev.yaml போன்ற வேறு எந்தப் பெயரும், அதை -f மூலம் குறிப்பிடும்போது மட்டுமே load செய்யப்படும்.
ஒரு -f-ஐ நீங்கள் வழங்கியவுடன், automatic loading நிறுத்தப்படும். docker compose -f compose.yaml up அந்த ஒரு கோப்பை மட்டும் படித்து, override file-ஐ புறக்கணிக்கும். இந்தப் பண்பை அடிப்படையாகக் கொண்டே இந்த வழிகாட்டியில் பின்னர் வரும் dev மற்றும் prod pattern அமைக்கப்பட்டுள்ளது.
Server-ல் இது இருவழிப் பாதிப்பை ஏற்படுத்தும். Deploy directory-யில் விடப்பட்ட override file, அந்த directory-யிலிருந்து இயக்கப்படும் ஒவ்வொரு bare docker compose command-ஆலும் load செய்யப்படும். இதில் உங்கள் cron job இயக்கும் command-உம் அடங்கும். இதனால், யாரும் ship செய்ய நினைக்காத source directory-ஐ production stack bind-mount செய்யக்கூடும். ஒவ்வொரு deploy-க்குப் பிறகும் docker compose config-ஐ இயக்கி, வெளியான முடிவைப் படிக்கவும்.
-f மூலம் வரிசைப்படுத்துதல் மற்றும் relative paths தீர்மானிக்கப்படும் இடம்
Compose, நீங்கள் files-ஐ வழங்கும் வரிசைப்படி configuration-ஐ உருவாக்கும். பின்னர் வரும் files, முந்தைய files-இல் உள்ளவற்றை override செய்து புதியவற்றைச் சேர்க்கும். இடமிருந்து வலமாக, கடைசியாக வரும் மதிப்பே நடைமுறைக்கு வரும்.
docker compose -f compose.yaml -f compose.prod.yaml config
docker compose -f compose.yaml -f compose.prod.yaml up -dஅந்த project-இல் உள்ள ஒவ்வொரு command-க்கும் ஒரே file list தேவை. இரண்டு files-உடன் up-ஐவும், ஒரு file-உடன் logs-ஐவும் இயக்கினால், வேறுபட்ட merged model-ஐப் பயன்படுத்துகிறீர்கள். இதனால் Compose இல்லை என்று கூறும் service-ஐப் பெறுவது எளிதாகும். அதற்குப் பதிலாக COMPOSE_FILE environment variable மூலம் இந்த list-ஐ ஒருமுறை அமைக்கவும்.
export COMPOSE_FILE=compose.yaml:compose.prod.yaml
docker compose config
docker compose up -dLinux-இல் separator : ஆகும். COMPOSE_PATH_SEPARATOR இதை மாற்றும். COMPOSE_FILE, project-இன் .env file-லும்கூட இருக்கலாம். அப்போது அது உங்கள் shell history-யின் பகுதியாக இல்லாமல் checkout-இன் பகுதியாக இருக்கும். command line-இல் வெளிப்படையாக அமைக்கப்படும் எந்த மதிப்பும் environment variable-ஐ விட முன்னுரிமை பெறும்.
Bind mounts-ஐ பாதிக்கும் விதி இதுதான். -f உடன் பல files-ஐப் பயன்படுத்தும்போது, அந்த files அனைத்திலும் உள்ள relative paths, அவற்றைக் கொண்ட file-ஐ அடிப்படையாகக் கொள்ளாமல், முதல் file இருக்கும் directory-ஐ அடிப்படையாகக் கொண்டு தீர்மானிக்கப்படும். deploy/prod/compose.prod.yaml-க்குள் ./data:/var/lib/postgresql/data-ஐ எழுதினாலும், Compose ./data-ஐ base file இருக்கும் இடத்துக்கு அருகில் தேடும். Docker பின்னர் அந்தத் தவறான path-இல் காலியான directory-ஐ உருவாக்கும். Container அதற்குள் எதுவும் இல்லாமல் தொடங்கும். இது data loss போலத் தோன்றும்; ஆனால் data loss ஏற்பட்டிருக்காது. Base path-ஐ நீங்களே அமைக்க --project-directory-ஐ வழங்கவும். அல்லது include-ஐப் பயன்படுத்தவும். இது ஒவ்வொரு file-ஐயும் அதன் சொந்த directory-ஐ அடிப்படையாகக் கொண்டு தீர்மானிக்கும்.
Project name அதே base directory-யிலிருந்து பெறப்படுகிறது. எனவே எந்த file முதலில் வருகிறது என்பதை மாற்றினால் project-ன் பெயர் மாறலாம். பெயர் மாற்றப்பட்ட project-க்கு புதிய container names மற்றும் புதிய volume names உருவாகும். பழைய volume, பழைய பெயரின் கீழ் disk-இல் தொடர்ந்து இருக்கும். இதைத் தவிர்க்க, base file-இல் top-level name:-ஐப் பயன்படுத்தி project name-ஐ நிலைப்படுத்தவும்.
name: myappஎந்த fields merge ஆகின்றன, எவை replace செய்யப்படுகின்றன
Compose, field-ன் பெயரை அடிப்படையாகக் கொண்டு அல்லாமல், அதன் value-ன் type-ஐ அடிப்படையாகக் கொண்டு merge செய்கிறது.
- Single-valued fields replace செய்யப்படுகின்றன.
image,command,entrypointமற்றும்mem_limitஆகியவை பின்னர் வரும் value-ஐ முழுமையாக ஏற்கின்றன.command-இல் ஒரு argument-ஐ append செய்ய முடியாது, ஏனெனில் override முழு line-ஐயும் மீண்டும் எழுதுகிறது. - Mappings key அடிப்படையில் merge ஆகின்றன.
environment,labels,volumesமற்றும்devicesஆகியவை இரண்டு files-லிருந்தும் உள்ள ஒவ்வொரு key-ஐயும் வைத்திருக்கும். இரு files-லுமே உள்ள key-க்கு, பின்னர் வரும் file-ன் value வெல்லும்.environmentமற்றும்labels-க்கு key என்பது variable அல்லது label-ன் பெயர்.volumesமற்றும்devices-க்கு key என்பது container path. - Sequences append செய்யப்படுகின்றன.
dns,dns_search,expose,tmpfsமற்றும்external_linksஆகியவை ஒன்றாக இணைக்கப்படுகின்றன.expose: ["3000"]கொண்ட base-ஐ["4000", "5000"]கொண்ட override உடன் merge செய்தால், அதன் விளைவு["3000", "4000", "5000"]ஆகும்.
நான்கு sequences-ல் identity key உள்ளது. எனவே அந்த key பொருந்தும் entries append ஆகாமல் merge ஆகின்றன. volumes, secrets மற்றும் configs ஆகியவை target அடிப்படையில் பொருந்துகின்றன. ports, ip, target, published மற்றும் protocol ஆகியவற்றின் சேர்க்கையை அடிப்படையாகக் கொண்டு பொருந்துகிறது.
இந்த ports rule-ஐ இருமுறை படிக்கவும். இதுவே பொதுவாகத் தவறாகப் புரிந்துகொள்ளப்படும் பகுதி. நான்கு பகுதிகளும் பொருந்தினால் மட்டுமே இரண்டு port entries ஒரே entry ஆகக் கருதப்படும். அவற்றில் ஏதேனும் ஒன்றை மாற்றினால், Compose அதை தொடர்பில்லாத இரண்டாவது port ஆகக் கருதும். எனவே இரண்டு entries-யையும் வைத்திருக்கும்.
override செய்யப்பட்ட பிறகும் port ஏன் வெளியிடப்படுகிறது
ஒவ்வொரு interface-லும் service-ஐ வெளியிடும் base file:
services:
web:
image: nginx:1.27
ports:
- "8080:80"reverse proxy அதன் முன்னால் இயங்கும் என்பதால், அதை localhost-க்கு மட்டும் bind செய்ய எழுதப்பட்ட override:
services:
web:
ports:
- "127.0.0.1:8080:80"இது செயல்பட்டது என்று கருதுவதற்கு முன் முடிவைச் சரிபார்க்கவும்.
docker compose -f compose.yaml -f compose.prod.yaml configவெளியீட்டில் இரண்டு entries உள்ளன. ip பகுதி வேறுபடுகிறது: 0.0.0.0 மற்றும் 127.0.0.1. ஆகவே merge செயல்முறைக்கு அவை இரண்டு வேறு ports ஆகும். நீங்கள் அகற்ற முயன்ற public binding இன்னும் model-ல் உள்ளது. Docker-ல் இது முக்கியமானது. காரணம், published port உங்கள் firewall rules-க்கு முன்பாக iptables-ல் எழுதப்படுகிறது. இந்த mechanism பற்றி published Docker ports ufw-ஐ எவ்வாறு கடந்து செல்கின்றன என்பதில் விளக்கப்பட்டுள்ளது.
இதற்கு இரண்டு தீர்வுகள் உள்ளன. வெளிப்படையான தீர்வு !override tag ஆகும். இது முழு attribute-ஐ மாற்றி, merge rules-ஐத் தவிர்க்கிறது:
services:
web:
ports: !override
- "127.0.0.1:8080:80"!override-க்கு Compose v2.24.4 அல்லது அதற்குப் பிந்தைய version தேவை. Portable தீர்வுக்கு எந்த tag-மும் தேவையில்லை: ports-ஐ base file-லிருந்து முழுமையாக நீக்கி, environment-specific files-ல் மட்டும் declare செய்யவும். Merge செய்ய எதுவும் இல்லையெனில், வெளியே கசிய எதுவும் இருக்காது. கீழே உள்ள worked example-ல் பயன்படுத்தப்பட்ட pattern இதுவாகும்.
அடிப்படை file-ல் அமைக்கப்பட்ட value-ஐ நீக்குதல்
!reset ஒரு attribute-ஐ நீக்கி, அதை அதன் default value அல்லது null நிலைக்கு மீட்டமைக்கிறது. இது ஒரு value-ஐ பெற்று அதை புறக்கணிக்கிறது. எனவே சரியான ஆனால் காலியான value-ஐ எழுதவும்.
services:
web:
ports: !reset []
environment:
DEBUG: !reset null!reset-க்கு Compose v2.24 அல்லது அதற்குப் பிந்தைய version தேவை. அடிப்படை file-ஐ உங்களால் திருத்த முடியாதபோது இதைப் பயன்படுத்தவும். எடுத்துக்காட்டாக, நீங்கள் சேர்க்கும் vendor fragment-க்கு இது பொருந்தும்.
பகுதிகளிலிருந்து அமைக்கப்படும் stacks-க்கான include
include மற்றொரு Compose application-ஐ உங்கள் model-க்குள் இழுக்கிறது. இது top-level element; flag அல்ல.
include:
- path: ../commons/compose.yamlinclude-இல் உள்ள ஒவ்வொரு path-உம் தனித்த Compose application model-ஆக ஏற்றப்படுகிறது. அதற்கென தனிப்பட்ட project directory இருக்கும். ஆகவே, அந்த file-க்குள் உள்ள relative paths, அந்த file-ன் சொந்த directory-ஐ அடிப்படையாகக் கொண்டு தீர்மானிக்கப்படுகின்றன. இதுவே -f-இலிருந்து உள்ள உண்மையான வேறுபாடு. Fragment வேறு folder அல்லது வேறு repository-ல் இருக்கும் போது include சரியான கருவியாக இருப்பதற்கான காரணமும் இதுதான்.
Long form-ல் sub-options உள்ளன.
include:
- path:
- ../monitoring/compose.yaml
- ../monitoring/compose.vps.yaml
project_directory: ../monitoring
env_file: ../monitoring/.envpath ஒரு list-ஐ ஏற்கிறது. அந்த files, வழக்கமான merge rules மூலம் ஒன்றிணைக்கப்பட்ட பிறகு, அதன் result உங்கள் model-இல் சேர்க்கப்படுகிறது. Included file-இல் உள்ள relative paths-ஐத் தீர்மானிக்கப் பயன்படுத்தப்படும் base path-ஐ project_directory அமைக்கிறது. Interpolation-க்காக included file-க்கு தனிப்பட்ட variables-ஐ env_file வழங்குகிறது. இதனால் shared fragment உங்கள் project-இன் .env-ஐ தெரியாமல் படிப்பது தடுக்கப்படுகிறது. include-க்கு Compose v2.20.0 அல்லது அதற்குப் புதிய version தேவை.
உங்கள் file மற்றும் included file ஆகியவற்றில் ஒரே resource name இருந்தால், அவை அமைதியாக merge செய்யப்படாமல் error-ஆகத் தெரிவிக்கப்படும். இது திட்டமிட்ட நடத்தை. Included file அறிவிக்கும் ஏதாவது ஒன்றை மாற்ற, அந்த மாற்றத்தை compose.override.yaml-இல் இடுங்கள். Override assembled model-க்கு பயன்படுத்தப்படுவதால், included resources-ஐ அவற்றுடன் மோதாமல் மாற்ற முடியும்.
சுருக்கமாக: include தனித்த applications-ஐ ஒன்றிணைக்கிறது; -f ஒரு application மீது configuration-ஐ அடுக்குகிறது.
ஒரு VPS-இல் dev மற்றும் prod பிரிப்பு
முழு pattern-ம் இந்த 3 files-ல் உள்ளது. Base file-ல் எல்லா சூழல்களிலும் உண்மையாக இருப்பவை குறிப்பிடப்படுகின்றன. இதில் எந்த port-களும் வெளியிடப்படுவதில்லை.
name: myapp
services:
app:
image: ghcr.io/example/app:1.4.2
environment:
DATABASE_URL: postgres://app:${POSTGRES_PASSWORD}@db:5432/app
LOG_LEVEL: info
depends_on:
db:
condition: service_healthy
restart: unless-stopped
db:
image: postgres:16
environment:
POSTGRES_USER: app
POSTGRES_DB: app
POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}
volumes:
- db_data:/var/lib/postgresql/data
healthcheck:
test: ["CMD-SHELL", "pg_isready -U app -d app"]
interval: 10s
timeout: 5s
retries: 5
restart: unless-stopped
volumes:
db_data:depends_on condition காரணமாக, வெறுமனே இருக்கும் container-க்காக அல்லாமல், பதிலளிக்கும் database-க்காக app காத்திருக்கும். இது healthchecks மற்றும் depends_on conditions என்பதில் விளக்கப்பட்டுள்ளது. POSTGRES_PASSWORD, project .env file-ல் இருந்து interpolated செய்யப்படுகிறது. அந்த file ஒருபோதும் git-ல் இருக்கக்கூடாது. பாதுகாப்பான மாற்றுகளுக்கு env files மற்றும் Compose secrets பார்க்கவும்.
அடுத்து, compose.override.yaml. இதை Compose தானாக load செய்கிறது. இது developer-ன் file.
services:
app:
build: .
command: npm run dev
environment:
LOG_LEVEL: debug
ports:
- "3000:3000"
volumes:
- ./src:/app/src
db:
ports:
- "127.0.0.1:5432:5432"Laptop-ல், வெறும் docker compose up இயக்கினால், இந்த 2 files merge செய்யப்படும். command, image default-ஐ மாற்றுகிறது, ஏனெனில் இது single-valued ஆகும். LOG_LEVEL, info-ஐ மாற்றுகிறது, ஏனெனில் environment key அடிப்படையில் merge செய்யப்படுகிறது. Bind mount மற்றும் வெளியிடப்பட்ட 2 ports கூடுதல்களாக மட்டுமே சேர்க்கப்படுகின்றன. Database port localhost-க்கு bind செய்யப்படுகிறது. எனவே shared network-ல் உள்ள laptop-களுக்கு PostgreSQL வழங்கப்படாது.
இறுதியாக, compose.prod.yaml. இதன் பெயரை Compose தேடாது. எனவே இது தவறுதலாக ஒருபோதும் load செய்யப்படாது.
services:
app:
ports:
- "127.0.0.1:8000:3000"
deploy:
resources:
limits:
memory: 512MVPS-ல் இரு files-ஐயும் குறிப்பிட வேண்டும். அந்தக் குறிப்பிடுதலே override-ஐ விலக்குகிறது.
docker compose -f compose.yaml -f compose.prod.yaml config
docker compose -f compose.yaml -f compose.prod.yaml up -d
docker compose -f compose.yaml -f compose.prod.yaml psps, இரு services-ம் running நிலையில் இருப்பதைக் காட்ட வேண்டும். மேலும் db, (healthy)-ஐக் காட்ட வேண்டும். நீங்கள் -f-ஐ வழங்கியதால், compose.override.yaml வாசிக்கப்படவில்லை. எனவே file அதே directory-ல் இருந்தாலும், dev command, source bind mount மற்றும் public port 3000 ஆகியவை production-ஐ அடைய முடியாது. Port 8000 localhost-ல் மட்டுமே உள்ளது; இது proxy-க்காக தயாராக உள்ளது. இரண்டாவது service-ஐ சேர்க்கும்போது Traefik பின்னால் பல apps-ஐ இயக்குதல் பார்க்கவும்.
Server-ன் .env-ல் COMPOSE_FILE=compose.yaml:compose.prod.yaml-ஐ அமைக்கவும். அதன் பிறகு உங்கள் மற்ற commands வழக்கமான docker compose logs -f app ஆக இருக்கும்.
Deploy செய்வதற்கு முன் merged model-ஐப் படிக்கவும்
docker compose config முழுமையாக merged செய்யப்பட்ட, முழுமையாக interpolated செய்யப்பட்ட model-ஐ அச்சிடுகிறது. இது preview அல்ல. Compose செயல்படுத்தும் துல்லியமான input இதுவாகும். ஆகவே output உங்கள் எதிர்பார்ப்புடன் முரண்பட்டால், output சரியானதாகும்.
docker compose -f compose.yaml -f compose.prod.yaml config
docker compose -f compose.yaml -f compose.prod.yaml config --no-interpolate
docker compose -f compose.yaml -f compose.prod.yaml config --services--no-interpolate, ${VAR}-ஐ expanded செய்யாமல் விட்டுவிடுகிறது. Output-ஐ எங்காவது paste செய்வதற்கு முன் இதைப் பயன்படுத்தவும். காரணம், plain config resolved secret-கள் அனைத்தையும் clear text-ஆக அச்சிடுகிறது. --services service names-ஐ மட்டும் பட்டியலிடுகிறது. எதிர்பார்த்ததைப் போல ஒரு include உள்ளே கொண்டுவரப்பட்டுள்ளதா என்பதை விரைவாக உறுதிப்படுத்த இது உதவும்.
தோல்வி நிலைகள், மேலும் நீங்கள் காண்பவை
no configuration file provided: not found. Compose படிக்க எதையும் கண்டறியவில்லை. நீங்கள் project directory-க்கு வெளியே இருக்கலாம், அல்லது COMPOSE_FILE குறிப்பிடும் path இல்லை. Compose இயல்புநிலை base file-ஐ parent directories-ல் தேடும். ஆனால் நீங்கள் தனியாகக் குறிப்பிட்ட file-ஐ எங்கும் தேடாது.
WARN[0000] The "POSTGRES_PASSWORD" variable is not set. Defaulting to a blank string. Interpolation, project-இன் .env file மற்றும் shell environment அடிப்படையில் மதிப்புகளைத் தீர்மானிக்கும். இங்கு project directory என்பது முதல் -f file இருக்கும் directory ஆகும். .env இருக்கும் directory-யிலிருந்து வேறு directory-ல் deploy செய்தால், இந்த warning தோன்றும். அதன் பிறகு எந்த connection-ஐயும் ஏற்காத database கிடைக்கும்.
உங்கள் override edit docker compose config-ல் தோன்றவில்லை. நீங்கள் -f-ஐ pass செய்திருக்கலாம். அது automatic override loading-ஐ முடக்கும். அல்லது Compose, parent directory-ல் compose.yaml-ஐ கண்டறிந்திருக்கலாம்; உங்கள் override file அதே directory-ல் இல்லை. வேறு arguments இல்லாமல் docker compose config-ஐ இயக்கினால், Compose உண்மையில் உருவாக்கும் model எது என்பதை அறியலாம்.
Bind mount காலியாக உள்ளது, மேலும் நீங்கள் கேட்காத directory-ஐ Docker உருவாக்கியுள்ளது. Relative path, முதல் file இருக்கும் directory-க்கு எதிராக resolve செய்யப்பட்டது. Path-ஐச் சரிசெய்யவும், --project-directory-ஐ pass செய்யவும், அல்லது fragment-ஐ include-க்குப் பின்னால் நகர்த்தவும்.
Containers புதிய பெயர்களுடன் மீண்டும் வருகின்றன, மேலும் volume காலியாகத் தெரிகிறது. Project name மாறியுள்ளது. காரணம், project name முதல் file இருக்கும் directory-ஐப் பின்பற்றுகிறது. Base file-ல் top-level name:-ஐச் சேர்க்கவும். இதனால் பெயர்கள் மாறுவது நிற்கும். பழைய volume, பழைய prefix-ன் கீழ் இன்னும் உள்ளது. docker volume ls அதை காட்டும்.
Override-ல் நீக்கிய port இன்னும் open-ஆக உள்ளது. ports merge, replace செய்வதற்குப் பதிலாக append செய்துள்ளது. docker compose config மூலம் உறுதிப்படுத்தவும். பின்னர் !override-ஐப் பயன்படுத்தவும் அல்லது ports-ஐ base file-லிருந்து நகர்த்தவும்.
FAQ
Compose-ஐ இயக்கும்போது compose.override.yaml தானாக ஏற்றப்படுமா?
ஆம். -f flag இல்லாமல் docker compose-ஐ இயக்கும்போது இது நிகழும். Compose, வேலைசெய்யும் directory மற்றும் அதன் parent directories-ல் compose.yaml அல்லது docker-compose.yaml என்பதைத் தேடும். அதனுடன் ஒரே directory-யில் override file இருந்தால், அந்த file இரண்டாவதாக ஏற்றப்படும். அங்கீகரிக்கப்பட்ட பெயர்கள் compose.override.yaml, compose.override.yml, docker-compose.override.yml மற்றும் docker-compose.override.yaml ஆகும். ஏதேனும் -f வழங்கினால் இந்தச் செயல்பாடு முடக்கப்படும். எனவே docker compose -f compose.yaml up ஒரு file-ஐ மட்டும் வாசிக்கும்.
பல -f files எந்த வரிசையில் merge செய்யப்படும்?
இடமிருந்து வலமாக. நீங்கள் வழங்கும் files-ன் வரிசைப்படி Compose configuration-ஐ உருவாக்கும். ஒவ்வொரு file-ம் அதற்கு முன் உள்ள files-ன் மதிப்புகளை override செய்து புதியவற்றைச் சேர்க்கும். எனவே வரியில் கடைசியாக உள்ள file, முரண்பாடு ஏற்பட்டால் முன்னுரிமை பெறும். அந்த project-இன் ஒவ்வொரு command-க்கும் இதே list பயன்படுத்தப்பட வேண்டும். இதற்காகத்தான் COMPOSE_FILE=compose.yaml:compose.prod.yaml பயன்படுகிறது.
Override செய்த பிறகும் எனது port ஏன் publish செய்யப்படுகிறது?
ஏனெனில் ports entries, ip, target, published மற்றும் protocol ஆகியவற்றின் முழுத் தொகுப்பைக் கொண்டு அடையாளம் காணப்படுகின்றன. 8080:80 என்ற base-க்கு எதிராக 127.0.0.1:8080:80-ஐ override செய்யும்போது, ip பகுதி வேறுபடுகிறது. எனவே Compose அதை இரண்டாவது port ஆகக் கருதி, இரண்டையும் வைத்திருக்கும். docker compose config-ஐ இயக்கினால் இரண்டு entries-ஐ காணலாம். Compose v2.24.4 அல்லது அதற்குப் பிந்தைய version-ல் ports: !override-ஐ பயன்படுத்தவும். அல்லது base file-ல் ports-ஐ வைக்காமல் இருக்கவும். அப்போது merge செய்ய அதற்கு இணையான மதிப்பு இருக்காது.
include மற்றும் -f ஆகியவற்றுக்கு இடையிலான வேறுபாடு என்ன?
-f பல files-ஐ ஒரே application மீது அடுக்குகிறது. ஒவ்வொரு file-லும் உள்ள relative path, முதல் file-ன் directory-ஐ அடிப்படையாகக் கொண்டு resolve செய்யப்படும். include ஒரு தனி Compose application-ஐ இணைக்கிறது. சேர்க்கப்பட்ட ஒவ்வொரு path-ம் அதன் சொந்த project directory-யைத் தக்கவைத்துக்கொள்ளும். எனவே அதன் relative paths, அந்த application-ஐ அடிப்படையாகக் கொண்டு resolve செய்யப்படும். உங்கள் சொந்த stack-இன் environment layers-க்கு -f-ஐப் பயன்படுத்தவும். வேறு இடத்தில் பராமரிக்கப்படும் fragment-க்கு include-ஐப் பயன்படுத்தவும். include-க்கு Compose v2.20.0 அல்லது அதற்குப் பிந்தைய version தேவை.
Base file அமைக்கும் மதிப்பை எவ்வாறு அகற்றுவது?
Compose v2.24 அல்லது அதற்குப் பிந்தைய version-ல் !reset tag-ஐப் பயன்படுத்தவும். Override file-ல் ports: !reset [] அல்லது MY_VAR: !reset null என்று எழுதவும். அப்போது attribute அதன் default மதிப்புக்கோ அல்லது null-க்கோ திரும்பும். Tag-க்கு வழங்கும் value அவசியமானது, ஆனால் அது புறக்கணிக்கப்படும். Attribute-ஐ அகற்றாமல் மாற்ற விரும்பினால் !override அதற்குப் பயன்படும். இதற்கு v2.24.4 அல்லது அதற்குப் பிந்தைய version தேவை.