SSD Nodes Learn 8GB RAM — సంవత్సరానికి $66
మార్గదర్శకాలు Matt Connorద్వారా Matt Connor · అప్‌డేట్ చేయబడింది 2026-08-01

Docker Composeలో అనేక ఫైళ్ల విలీనం ఎలా పనిచేస్తుంది

compose.override.yaml స్వయంగా ఎలా లోడ్ అవుతుంది, ఫైళ్ల క్రమం విలీనాన్ని ఎలా మార్చుతుంది, ports వల్ల పోర్ట్ ఎందుకు తెరిచి ఉంటుంది, dev మరియు prod విభజనకు include ఎలా వాడాలో తెలుసుకోండి.

ఒకటి కంటే ఎక్కువ ఫైళ్లతో Compose చేసే పని

Docker Compose అనేక ఫైళ్ల నుంచి ఒక ప్రాజెక్ట్‌ను రూపొందించగలదు. ఇది అందుకున్న క్రమంలో ఫైళ్లను చదివి, వాటిని ఒకే మోడల్‌గా విలీనం చేస్తుంది. అందువల్ల విరుద్ధంగా ఉన్న ఏ విలువకైనా తర్వాతి ఫైల్‌లోని విలువ ప్రాధాన్యం పొందుతుంది. కమాండ్ లైన్ నుంచి దీన్ని చేయడానికి రెండు విధానాలు ఉన్నాయి: Compose స్వయంగా లోడ్ చేసే override ఫైల్, మరియు మీరు చేతితో అందించే -f flag. మూడవ విధానం ఫైల్‌లోనే ఉండే include element. ఇది మిగతా రెండింటికంటే భిన్నంగా పనిచేస్తుంది.

విలీనం అనేది సాధారణ overwrite కాదు. Mappings key వారీగా విలీనం అవుతాయి, sequences చివరికి జతచేయబడతాయి, కొద్ది fields మాత్రం పూర్తిగా భర్తీ చేయబడతాయి. ఈ తేడానే అనుకోని ఫలితాలకు కారణమవుతుంది. దాదాపు అందరినీ ఇబ్బంది పెట్టే అంశం ports list.

క్రిందివన్నీ పాత docker-compose script కాకుండా Compose v2 లోని docker compose plugin‌ను ఉపయోగిస్తున్నాయని భావిస్తాయి. తనిఖీ చేయడానికి docker compose version అమలు చేయండి. మీరు ఇంకా Compose file రాయకపోతే, Docker Compose ప్రాథమికాల మార్గదర్శకంతో ప్రారంభించి, తర్వాత ఇక్కడికి తిరిగి రండి.

Compose చెప్పకపోయినా లోడ్ చేసే override ఫైల్

-f flag లేకుండా docker compose up ను అమలు చేస్తే, Compose పని చేసే directoryలో, తరువాత దాని parent directoriesలో compose.yaml లేదా docker-compose.yaml కోసం శోధిస్తుంది. base file పక్కన override file ఉంటే, Compose దాన్ని స్వయంచాలకంగా రెండవ fileగా లోడ్ చేస్తుంది.

ls compose.yaml compose.override.yaml
docker compose up -d

రెండు files ఉన్నప్పుడు, వాటిని చేతితో వరుసగా ఇచ్చినట్లే ఫలితం ఉంటుంది.

docker compose -f compose.yaml -f compose.override.yaml up -d

Compose గుర్తించే పేర్లు compose.override.yaml, compose.override.yml, అలాగే పాత docker-compose.override.yml మరియు docker-compose.override.yaml. compose.dev.yaml వంటి ఇతర పేర్లు, -f తో ఆ file పేరును స్పష్టంగా ఇచ్చినప్పుడే లోడ్ అవుతాయి.

మీరు ఒక్క -f ను ఇచ్చిన వెంటనే, automatic loading ఆగిపోతుంది. docker compose -f compose.yaml up సరిగ్గా ఆ ఒక్క fileనే చదివి override fileను పట్టించుకోదు. ఈ లక్షణంపైనే ఈ guideలో తరువాతి dev మరియు prod pattern ఆధారపడి ఉంటుంది.

Serverలో ఇది రెండు విధాలుగా ప్రభావితం చేస్తుంది. deploy directoryలో మిగిలిపోయిన override fileను, ఆ directory నుంచి అమలు చేసే ప్రతి bare docker compose command లోడ్ చేస్తుంది. cron job అమలు చేసే command కూడా ఇందులో ఉంటుంది. ఉద్దేశించని source directoryని bind-mount చేస్తూ production stack ఏర్పడటానికి ఇదే కారణం. ప్రతి deploy తర్వాత docker compose config ను అమలు చేసి, వచ్చిన outputను పరిశీలించండి.

-f తో ఆర్డర్ మరియు relative paths పరిష్కరించబడే స్థలం

Compose మీరు ఫైళ్లను అందించిన క్రమంలో configuration ను నిర్మిస్తుంది. తరువాతి ఫైళ్లు ముందున్న ఫైళ్లలోని విలువలను 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 అవసరం. రెండు ఫైళ్లతో up ను, ఒక ఫైల్‌తో logs ను అమలు చేస్తే, మీరు వేర్వేరు merged model లతో పని చేస్తున్నట్లే. దీని వల్ల Compose వద్ద లేని service ఉందని చూపించే పరిస్థితి త్వరగా ఏర్పడుతుంది. బదులుగా COMPOSE_FILE environment variable తో ఈ list ను ఒకసారి సెట్ చేయండి.

export COMPOSE_FILE=compose.yaml:compose.prod.yaml
docker compose config
docker compose up -d

Linux లో separator :. COMPOSE_PATH_SEPARATOR దాన్ని మార్చుతుంది. COMPOSE_FILE ను project లోని .env file లో కూడా ఉంచవచ్చు. అప్పుడు అది మీ shell history లో కాకుండా checkout లో భాగమవుతుంది. command line లో స్పష్టంగా సెట్ చేసిన ఏ విలువైనా environment variable కంటే ప్రాధాన్యత పొందుతుంది.

ఇప్పుడు bind mounts ను ప్రభావితం చేసే నియమం. -f తో బహుళ ఫైళ్లను ఉపయోగించినప్పుడు, ఆ ఫైళ్లన్నింటిలోని 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: ను ఉపయోగించండి.

name: myapp

ఏ ఫీల్డ్‌లు విలీనం అవుతాయి, ఏవి భర్తీ చేయబడతాయి

Compose ఫీల్డ్ పేరును బట్టి కాకుండా, విలువ రకాన్ని బట్టి విలీనం చేస్తుంది.

  • ఒకే విలువ కలిగిన ఫీల్డ్‌లు భర్తీ చేయబడతాయి. image, command, entrypoint మరియు mem_limit తర్వాతి విలువను పూర్తిగా తీసుకుంటాయి. commandకు ఒక ఆర్గ్యుమెంట్‌ను జోడించలేరు, ఎందుకంటే override మొత్తం లైన్‌ను తిరిగి రాస్తుంది.
  • మ్యాపింగ్‌లు ప్రతి కీ ఆధారంగా విలీనం అవుతాయి. environment, labels, volumes మరియు devices రెండు ఫైళ్లలోని ప్రతి కీని ఉంచుతాయి. రెండు ఫైళ్లలో ఒకే కీ ఉంటే, తర్వాతి ఫైల్‌లోని విలువ వర్తిస్తుంది. environment మరియు labels కోసం కీ variable లేదా label పేరు. volumes మరియు devices కోసం కీ container path.
  • సీక్వెన్స్‌లు జోడించబడతాయి. dns, dns_search, expose, tmpfs మరియు external_links కలిపి ఉంచబడతాయి. expose: ["3000"]ను కలిగి ఉన్న baseను ["4000", "5000"]ను కలిగి ఉన్న overrideతో విలీనం చేస్తే ["3000", "4000", "5000"] ఉత్పత్తి అవుతుంది.

నాలుగు సీక్వెన్స్‌లలో identity key ఉంటుంది. అందువల్ల ఆ కీ సరిపోలే entries జోడించబడకుండా విలీనం అవుతాయి. volumes, secrets మరియు configs target ఆధారంగా సరిపోలుతాయి. ports, ip, target, published మరియు protocolల కలయిక ఆధారంగా సరిపోలుతుంది.

ports నియమాన్ని రెండుసార్లు చదవండి. ఇక్కడే సాధారణంగా పొరపాటు జరుగుతుంది. నాలుగు భాగాలు ఒకేలా ఉన్నప్పుడే రెండు port entries ఒకే entryగా పరిగణించబడతాయి. వాటిలో ఏదైనా ఒకదాన్ని మార్చితే Compose దాన్ని రెండో, సంబంధం లేని portగా పరిగణిస్తుంది. అందువల్ల రెండింటినీ ఉంచుతుంది.

override చేసిన తర్వాత కూడా మీ port ఎందుకు published‌గా ఉంది

ప్రతి interfaceపై service‌ను publish చేసే 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 కూడా outputలో ఉన్నాయి. ip భాగం భిన్నంగా ఉంది: 0.0.0.0 మరియు 127.0.0.1. అందువల్ల merge పరంగా అవి రెండు వేర్వేరు ports. మీరు తొలగించడానికి ప్రయత్నించిన public binding ఇప్పటికీ modelలో ఉంది. ఇతర సందర్భాల కంటే Dockerలో ఇది మరింత ముఖ్యమైనది. కారణం, published port మీ firewall rulesకు ముందే iptablesలో రాయబడుతుంది. ఈ విధానం గురించి published Docker ports ufwను ఎందుకు దాటి వెళ్తాయిలో వివరించారు.

దీనికి రెండు పరిష్కారాలు ఉన్నాయి. స్పష్టమైన పరిష్కారం !override tag. ఇది మొత్తం attributeను replace చేసి 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 చేయడానికి ఏదీ లేకపోతే leak అయ్యేది కూడా ఏదీ ఉండదు. కింద ఉన్న worked exampleలో ఇదే pattern ఉపయోగించబడింది.

ఆధార ఫైల్ సెట్‌లోని విలువను తొలగించడం

!reset ఒక attribute‌ను తొలగించి, దాన్ని దాని default విలువకు లేదా null‌కు మార్చుతుంది. దీనికి ఒక విలువ అవసరం, కానీ ఆ విలువను పట్టించుకోదు. అందువల్ల చెల్లుబాటు అయ్యే ఖాళీ విలువను రాయండి.

services:
  web:
    ports: !reset []
    environment:
      DEBUG: !reset null

!resetకు Compose v2.24 లేదా ఆ తర్వాతి వెర్షన్ అవసరం. ఆధార ఫైల్‌ను మీరు సవరించలేనప్పుడు, ఉదాహరణకు మీరు చేర్చుకునే vendor fragment విషయంలో, దీన్ని ఉపయోగించండి.

భాగాల నుంచి నిర్మించిన స్టాక్‌ల కోసం include

include మరో Compose అప్లికేషన్‌ను మీ మోడల్‌లోకి తీసుకువస్తుంది. ఇది అగ్రస్థాయి ఎలిమెంట్, flag కాదు.

include:
  - path: ../commons/compose.yaml

include లోని ప్రతి path దాని స్వంత Compose అప్లికేషన్ మోడల్‌గా లోడ్ అవుతుంది. దానికి స్వంత project directory ఉంటుంది. అందువల్ల ఆ file లోని relative paths, ఆ file ఉన్న directory ఆధారంగా పరిష్కరించబడతాయి. ఇదే -f తో ఉన్న అసలు తేడా. fragment మరో folder లేదా మరో repository లో ఉన్నప్పుడు include సరైన సాధనం కావడానికి ఇదే కారణం.

దీర్ఘ రూపంలో sub-options ఉంటాయి.

include:
  - path:
      - ../monitoring/compose.yaml
      - ../monitoring/compose.vps.yaml
    project_directory: ../monitoring
    env_file: ../monitoring/.env

path ఒక జాబితాను స్వీకరిస్తుంది. ఆ files సాధారణ నియమాల ప్రకారం పరస్పరం merge చేయబడతాయి. తర్వాత వచ్చిన ఫలితం మీ model‌లో చేరుతుంది. project_directory included file‌లోని relative paths‌ను పరిష్కరించడానికి ఉపయోగించే base path‌ను నిర్దేశిస్తుంది. env_file interpolation కోసం included file‌కు స్వంత variables‌ను ఇస్తుంది. దీని వల్ల shared fragment మీ project‌లోని .env ను నిశ్శబ్దంగా చదవదు. include కు Compose v2.20.0 లేదా తర్వాతి version అవసరం.

మీ file మరియు included file మధ్య resource names ఒకేలా ఉంటే, అవి నిశ్శబ్దంగా merge కావు; బదులుగా error‌గా నివేదించబడతాయి. ఇది ఉద్దేశపూర్వక ప్రవర్తన. Included file ప్రకటించిన దానిలో మార్పు చేయాలంటే, ఆ మార్పును compose.override.yaml లో ఉంచండి. Override assembled model‌పై వర్తిస్తుంది. అందువల్ల included resources‌తో పేరు ఢీకొనకుండా వాటిని మార్చవచ్చు.

సంక్షిప్తంగా: include వేర్వేరు applications‌ను compose చేస్తుంది; -f ఒకే application‌పై configuration‌ను layer చేస్తుంది.

ఒక VPSలో dev మరియు prod విభజన

మొత్తం నమూనా ఈ మూడు ఫైళ్లలో ఉంది. బేస్ ఫైల్ అన్ని చోట్ల వర్తించే విషయాలను నిర్వచిస్తుంది. ఇది ఎలాంటి ports ను publish చేయదు.

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 నుంచి interpolate అవుతుంది. ఆ 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 ఆ రెండు filesను merge చేస్తుంది. command image defaultను భర్తీ చేస్తుంది, ఎందుకంటే ఇది single-valued. LOG_LEVEL, infoను భర్తీ చేస్తుంది, ఎందుకంటే environment key ఆధారంగా merge చేస్తుంది. bind mount మరియు publish చేసిన రెండు ports పూర్తిగా అదనంగా చేరతాయి. database portను localhostకు bind చేస్తారు. అందువల్ల shared networkలోని laptop PostgreSQLను అదే networkలోని ఇతరులకు అందించదు.

చివరగా compose.prod.yaml. Compose వెతికే పేర్లలో ఇది లేదు. అందువల్ల ఇది అనుకోకుండా ఎప్పుడూ load కాదు.

services:
  app:
    ports:
      - "127.0.0.1:8000:3000"
    deploy:
      resources:
        limits:
          memory: 512M

VPSలో మీరు రెండు 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 ps

ps రెండు services runningలో ఉన్నాయని చూపాలి. dbలో (healthy) కనిపించాలి. మీరు -fను pass చేసినందున compose.override.yaml చదవబడలేదు. అందువల్ల dev command, source bind mount మరియు public port 3000 productionకు చేరలేవు, file అదే directoryలో ఉన్నప్పటికీ. Port 8000 localhostలో మాత్రమే ఉంటుంది. ఇది proxy కోసం సిద్ధంగా ఉంటుంది. రెండవ serviceను జోడించినప్పుడు Traefik వెనుక అనేక appsను నడపడం చూడండి.

Serverలోని .envలో COMPOSE_FILE=compose.yaml:compose.prod.yamlను సెట్ చేయండి. ఆ తర్వాత మీ మిగిలిన commands సాధారణ docker compose logs -f appగా ఉంటాయి.

డిప్లాయ్ చేయడానికి ముందు విలీనం చేసిన మోడల్‌ను చదవండి

docker compose config పూర్తిగా విలీనం చేసి, పూర్తిగా ఇంటర్‌పోలేట్ చేసిన మోడల్‌ను ప్రింట్ చేస్తుంది. ఇది ప్రివ్యూ కాదు. Compose పనిచేసే ఖచ్చితమైన ఇన్‌పుట్ ఇదే. కాబట్టి అవుట్‌పుట్ మీ అంచనాతో సరిపోలకపోతే, సరైనది అవుట్‌పుట్‌నే.

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} ను విస్తరించకుండా ఉంచుతుంది. అవుట్‌పుట్‌ను ఎక్కడైనా పేస్ట్ చేయడానికి ముందు దీన్ని ఉపయోగించండి. ఎందుకంటే సాధారణ config పరిష్కరించబడిన ప్రతి రహస్యాన్ని స్పష్టమైన టెక్స్ట్‌గా ప్రింట్ చేస్తుంది. --services సేవా పేర్లను మాత్రమే జాబితా చేస్తుంది. మీరు ఆశించినదాన్ని include లోడ్ చేసిందో త్వరగా నిర్ధారించడానికి ఇది ఉపయోగపడుతుంది.

వైఫల్య పరిస్థితులు మరియు మీరు చూసేది

no configuration file provided: not found. చదవడానికి Compose‌కు ఏదీ కనుగొనబడలేదు. మీరు ప్రాజెక్ట్ డైరెక్టరీ వెలుపల ఉన్నారు లేదా COMPOSE_FILE ఉనికిలో లేని పాత్‌ను సూచిస్తోంది. Compose డిఫాల్ట్ బేస్ ఫైల్ కోసం పేరెంట్ డైరెక్టరీలను శోధిస్తుంది. అయితే, మీరు స్వయంగా పేర్కొన్న ఫైల్ కోసం అది ఎక్కడా శోధించదు.

WARN[0000] The "POSTGRES_PASSWORD" variable is not set. Defaulting to a blank string. Interpolation ప్రాజెక్ట్‌లోని .env ఫైల్ మరియు shell environment ఆధారంగా పరిష్కరించబడుతుంది. ఇక్కడి ప్రాజెక్ట్ డైరెక్టరీ మొదటి -f ఫైల్ ఉన్న డైరెక్టరీ. .env ఉన్న డైరెక్టరీకి భిన్నమైన డైరెక్టరీ నుంచి deploy చేస్తే, ఈ warning కనిపిస్తుంది. ఆ తర్వాత ప్రతి connection‌ను తిరస్కరించే database మీకు కనిపిస్తుంది.

మీ override edit docker compose configలో కనిపించదు. మీరు -f పాస్ చేసి ఉండవచ్చు. దాంతో automatic override loading ఆఫ్ అవుతుంది. లేదా Compose పేరెంట్ డైరెక్టరీలో compose.yamlను కనుగొని ఉండవచ్చు. అప్పుడు మీ override file దాని పక్కన ఉండదు. ఇతర arguments ఏవీ లేకుండా docker compose configను run చేస్తే, Compose వాస్తవంగా ఏ model‌ను build చేస్తుందో తెలుస్తుంది.

Bind mount ఖాళీగా ఉంది. మీరు అడగని directory‌ను Docker సృష్టించింది. Relative path మొదటి file ఉన్న డైరెక్టరీకి సంబంధించి పరిష్కరించబడింది. Path‌ను సరిచేయండి, --project-directory పాస్ చేయండి లేదా fragment‌ను include వెనుకకు తరలించండి.

Containers కొత్త పేర్లతో తిరిగి వచ్చాయి. Volume ఖాళీగా కనిపిస్తోంది. Project name మారింది, ఎందుకంటే project name మొదటి file ఉన్న డైరెక్టరీని అనుసరిస్తుంది. 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 ను స్వయంచాలకంగా లోడ్ చేస్తుందా?

అవును, మీరు docker compose ను -f flag లేకుండా అమలు చేసినప్పుడు ఇది జరుగుతుంది. Compose పని చేసే directory మరియు దాని parent directoriesలో compose.yaml లేదా docker-compose.yaml కోసం శోధిస్తుంది. Override file దాని పక్కన ఉంటే, ఆ file రెండవదిగా లోడ్ అవుతుంది. గుర్తించబడిన పేర్లు compose.override.yaml, compose.override.yml, docker-compose.override.yml మరియు docker-compose.override.yaml. ఏదైనా -f pass చేస్తే ఈ ప్రవర్తన నిలిపివేయబడుతుంది. అందువల్ల docker compose -f compose.yaml up ఒక్క fileను మాత్రమే చదువుతుంది.

అనేక -f files ఏ క్రమంలో merge అవుతాయి?

ఎడమ నుంచి కుడికి. మీరు filesను అందించిన క్రమంలో Compose configurationను నిర్మిస్తుంది. ప్రతి file తనకు ముందు ఉన్న filesపై విలువలను override చేసి, కొత్త విలువలను జోడిస్తుంది. అందువల్ల lineలో చివర ఉన్న file ఏ conflictలోనైనా ప్రాధాన్యం పొందుతుంది. ఆ projectలోని ప్రతి commandకు ఇదే list ఉపయోగించాలి. ఇందుకోసమే COMPOSE_FILE=compose.yaml:compose.prod.yaml ఉపయోగిస్తారు.

Override చేసిన తర్వాత కూడా నా port ఎందుకు publishedగానే ఉంది?

ఎందుకంటే 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పై layer చేస్తుంది. ప్రతి fileలోని relative path, మొదటి fileకు చెందిన directory ఆధారంగా resolve అవుతుంది. include వేరు Compose applicationను చేర్చుతుంది. చేర్చిన ప్రతి path తన స్వంత project directoryను ఉపయోగిస్తుంది. అందువల్ల దాని relative paths అదే directory ఆధారంగా resolve అవుతాయి. మీ స్వంత stackలోని environment layers కోసం -f ఉపయోగించండి. వేరే చోట నిర్వహించే fragment కోసం include ఉపయోగించండి. include కు Compose v2.20.0 లేదా తర్వాతి version అవసరం.

Base file సెట్ చేసిన valueను ఎలా తొలగించాలి?

Compose v2.24 లేదా తర్వాతి versionలో !reset tag ఉపయోగించండి. Override fileలో ports: !reset [] లేదా MY_VAR: !reset null రాయండి. అప్పుడు attribute దాని default విలువకు లేదా nullకు తిరిగి వెళ్తుంది. Tagకు ఇచ్చే value అవసరం, కానీ దాన్ని పట్టించుకోరు. Attributeను clear చేయకుండా దాని స్థానంలో వేరే విలువను పెట్టాలంటే !override ఉపయోగించండి. దీనికి v2.24.4 లేదా తర్వాతి version అవసరం.