SSD Nodes Learn Hosting plans →
கல்வி வழிகாட்டிகள் Matt Connorஆல் Matt Connor · புதுப்பிக்கப்பட்டது 2026-08-03

Docker Compose-ல் .env, env_file, environment வேறுபாடு

Docker Compose-ல் .env, env_file, environment ஆகிய மூன்றும் எவ்வாறு வேறுபடுகின்றன, ஒரே key வந்தால் எது முன்னுரிமை பெறும், secrets எங்கு வைக்க வேண்டும் என்பதைக் கற்கவும்.

env file என்று பொதுவாக அழைக்கப்படும் மூன்று விஷயங்கள்

Docker Compose-ல் பெயர்கள் ஒன்றுக்கொன்று மிகவும் ஒத்திருந்தாலும், மூன்று தனித்தனி mechanisms உள்ளன. .env file, compose.yaml file-க்குள் உள்ள ${VARIABLE} placeholders-ஐ Compose அந்த file-ஐ parse செய்வதற்கு முன்பே நிரப்புகிறது. env_file: attribute, key/value pairs கொண்ட ஒரு file-ஐ container-ன் environment-க்குள் load செய்கிறது. environment: attribute, compose file-ல் நேரடியாக எழுதப்பட்ட variables-ஐ container-ல் அமைக்கிறது. இவை ஒன்றுக்கொன்று மாற்றாக பயன்படுத்த முடியாது. இரண்டும் ஒரே key-ஐ அமைத்தால், வெற்றி பெறுவது documented precedence order மூலம் நிர்ணயிக்கப்படுகிறது.

இந்த guide ஒவ்வொன்றும் எவ்வாறு செயல்படுகிறது என்பதை காட்டுகிறது. நீங்கள் இயக்கக்கூடிய command மூலம் precedence-ஐ உறுதிப்படுத்துகிறது. அதைவிட முக்கியமான அம்சத்தையும் விளக்குகிறது: docker inspect-ஐ இயக்கக்கூடிய யாரும் environment variables-ஐ படிக்க முடியும். எனவே passwords-ஐ அவற்றில் வைக்கக்கூடாது. compose files பற்றி பொதுவாக அறிமுகம் தேவைப்பட்டால், முதலில் VPS-ல் Docker Compose அடிப்படைகள் பகுதியைப் படிக்கவும். பின்னர் configuration தொடர்பான இந்தப் பகுதிக்குத் திரும்பவும்.

.env file compose file-க்கானது; container-க்கானது அல்ல

ஒரு directory-ஐ உருவாக்கி, அதில் இரண்டு files-ஐ வைக்கவும்.

mkdir -p ~/envdemo && cd ~/envdemo
printf 'ALPINE_TAG=3.20\n' > .env
services:
  demo:
    image: alpine:${ALPINE_TAG}
    command: printenv ALPINE_TAG

இப்போது Compose உண்மையில் எதை parse செய்தது என்பதைப் பார்க்கவும்.

docker compose config

Output-ல் image: alpine:3.20 காட்டப்படும். Placeholder இல்லை, ஏனெனில் interpolation parse நேரத்திலேயே நடந்துவிட்டது. Compose project directory-ல் உள்ள .env-ஐ தேடும். Project directory என்பது compose file இருக்கும் directory ஆகும். அங்கே காணப்படும் ஒவ்வொரு ${NAME}-ஐயும் Compose மாற்றும்.

பிறகு service-ஐ இயக்கவும்.

docker compose run --rm demo

printenv ALPINE_TAG status 1-உடன் நிறுத்திக்கொண்டு, எதையும் print செய்யாது. அந்த variable container-க்குள் இல்லை. இதுவே மிகவும் பொதுவான தவறான புரிதல்: .env compose file-ஐ configure செய்தது; process-ஐ அல்ல. .env file-ல் POSTGRES_PASSWORD=hunter2 இருந்தாலும், compose file-ன் எந்தப் பகுதியும் அதைக் reference செய்யாவிட்டால், அது உங்கள் database-க்கு எந்த விளைவையும் ஏற்படுத்தாது.

${NAME:-default} variable unset அல்லது empty ஆக இருக்கும்போது fallback value-ஐ வழங்கும். ${NAME:?message} Compose start ஆகாமல் தடுத்து, நீங்கள் கொடுத்த message-ஐ print செய்யும். பாதுகாப்பான default இல்லாத value-க்கு இதுவே சரியான தேர்வு.

env_file container-ல் variables-ஐ ஏற்றுகிறது

env_file: attribute-ல், அதன் உள்ளடக்கம் container environment variables-ஆக மாறும் ஒன்று அல்லது அதற்கு மேற்பட்ட files குறிப்பிடப்படுகின்றன.

printf 'GREETING=from_env_file\nAPP_MODE=production\n' > app.env
services:
  demo:
    image: alpine:3.20
    command: printenv GREETING
    env_file:
      - ./app.env
docker compose run --rm demo

இது from_env_file-ஐ அச்சிடும். File format என்பது ஒவ்வொரு வரியிலும் ஒரு plain KEY=value entry கொண்டதாகும். #-ல் தொடங்கும் வரி comment ஆகக் கருதப்படும். இது shell format அல்ல. பெரும்பாலான சந்தர்ப்பங்களில் quotes value-ன் ஒரு பகுதியாகவே வைக்கப்படும். export prefixes தேவையில்லை. = sign-ன் இருபுறமும் spaces வைக்க வேண்டாம். இல்லையெனில் KEY = value, value-ன் தொடக்கத்தில் leading space கொண்ட KEY என்ற பெயருடைய variable-ஐ உருவாக்கும்.

env_file path இல்லாதது error ஆகும்; Compose நிறுத்தப்படும். அந்த file இல்லாமல் இருப்பது சரியான நிலையாக இருக்கலாம் என்றால், அதை optional-ஆகக் குறிக்கவும்:

    env_file:
      - path: ./app.env
        required: false

environment variables-ஐ inline-ஆக அமைக்கிறது

services:
  demo:
    image: alpine:3.20
    command: printenv GREETING
    environment:
      GREETING: from_environment

மேலே காட்டிய mapping form மற்றும் - GREETING=from_environment-ஐ பயன்படுத்தும் list form ஆகிய 2 syntaxes ஏற்கப்படுகின்றன. இரண்டும் ஒரே விதமாக செயல்படும். List form-க்கு ஒரு கூடுதல் வசதி உள்ளது: value இல்லாத bare key-ஐ குறிப்பிடும்போது, docker compose இயக்கப்பட்ட shell-இலிருந்து அந்த variable-ன் மதிப்பு pass through செய்யப்படும்.

    environment:
      - GREETING
GREETING=from_my_shell docker compose run --rm demo

இது from_my_shell-ஐ print செய்யும். Shell-ல் GREETING-ஐ set செய்யாமல் இதை இயக்கினால், Compose எந்த மதிப்பையும் set செய்யாது; warning-உம் காட்டாது. இவ்வாறு அமைதியாக ஏற்படும் pass-through தோல்விகளை அறிந்திருக்க வேண்டும். Empty password variable உடன் தொடங்கும் service பெரும்பாலும் வெற்றிகரமாக start ஆகும்; ஆனால் அது authentication இல்லாமல் முழுமையாக exposed ஆகிவிடும்.

எது முன்னுரிமை பெறும்

Docker precedence வரிசையை அதிக முன்னுரிமையிலிருந்து குறைந்த முன்னுரிமை வரை ஆவணப்படுத்துகிறது: command line-ல் வழங்கப்படும் docker compose run -e, அதன் பிறகு shell அல்லது env file-லிருந்து value interpolation செய்யப்படும் environment அல்லது env_file, அதன் பிறகு compose file-ல் உள்ள சாதாரண environment, அடுத்து env_file, இறுதியாக image-க்குள் முன்கூட்டியே சேர்க்கப்பட்ட ENV directive.

தினசரி பயன்பாட்டிற்கான சுருக்கமான விதி: environment:, env_file:-ஐ விட முன்னுரிமை பெறும். command line-ல் வழங்கப்படும் -e, இரண்டையும் விட முன்னுரிமை பெறும். இதை ஒரே file-ல் நிரூபிக்கலாம்.

services:
  demo:
    image: alpine:3.20
    command: printenv GREETING
    env_file:
      - ./app.env
    environment:
      GREETING: from_environment
docker compose run --rm demo
docker compose run --rm -e GREETING=from_cli demo printenv GREETING

முதல் command from_environment-ஐ வெளியிடுகிறது. அதாவது environment:, app.env-ல் உள்ள value-ஐ override செய்துள்ளது. இரண்டாவது command from_cli-ஐ வெளியிடுகிறது. compose file-ல் உள்ள எந்த அமைப்பும் command line value-ஐ override செய்யாது.

உங்கள் config பயன்படுத்தப்படாதது போல் container செயல்பட்டால், ஊகிக்க வேண்டாம். docker compose config முழுமையாகத் தீர்மானிக்கப்பட்ட file-ஐ வெளியிடும். docker compose config --environment, Compose பயன்படுத்தும் interpolation variables-ஐ வெளியிடும். “எனது env file புறக்கணிக்கப்படுகிறது” என்ற பெரும்பாலான பிரச்சினைகளில், ஒரே value இரண்டு வெவ்வேறு நிலைகளில் அமைக்கப்பட்டிருக்கும்.

environment variables ஏன் leak ஆகின்றன

environment:-ல் password-ஐ அமைத்தால், அது container-ன் configuration-ல் disk மீது சேமிக்கப்படும். docker group-ல் உள்ள எந்த user-க்கும் அதை பார்க்க முடியும்.

docker compose run -d --name leaky -e DB_PASSWORD=hunter2 demo sleep 300
docker inspect leaky --format '{{json .Config.Env}}'

Output-ல் "DB_PASSWORD=hunter2" plain text-ஆக உள்ளது. மேலும் மூன்று paths அதே value-ஐ வெளிப்படுத்துகின்றன. docker compose config அதை terminal-ல் print செய்கிறது. அதனால் அது support forum-ல் paste செய்யப்படும் நிலை ஏற்படுகிறது. Container-க்குள் இயங்கும் எந்த process-மும் /proc/1/environ-ஐ படிக்க முடியும். அந்த variable-ஐ ஒவ்வொரு child process-மும் inherit செய்கிறது. Application crash handlers பொதுவாக முழு environment-ஐ log அல்லது error report-ல் dump செய்கின்றன.

docker group-ல் membership இருப்பது host-ல் root access இருப்பதற்கு சமம். எனவே இதை privilege boundary-ஆக நம்ப முடியாது. Shared server-ல் அந்த group-ன் membership-ஐ ஏன் கட்டுப்படுத்த வேண்டும் என்பதை VPS-ல் least privilege user accounts என்ற வழிகாட்டி விளக்குகிறது.

Compose secrets மதிப்பை ஒரு file-ல் வைத்திருக்கும்

Compose, file அடிப்படையிலான secrets-ஐ ஆதரிக்கிறது. மதிப்பு environment-க்குள் செலுத்தப்படுவதற்குப் பதிலாக, container-ல் ஒரு file-ஆக mount செய்யப்படும்.

services:
  db:
    image: postgres:16
    environment:
      POSTGRES_PASSWORD_FILE: /run/secrets/db_password
    secrets:
      - db_password
secrets:
  db_password:
    file: ./db_password.txt

Secret, container-க்குள் /run/secrets/db_password என்ற path-ல் mount செய்யப்படுகிறது. Slash-க்கு அடுத்துள்ள பெயர், மேல் நிலை secrets: block-ல் உள்ள secret name ஆகும்.

_FILE suffix என்பது postgres, mysql மற்றும் mariadb உள்ளிட்ட Docker Official Images பயன்படுத்தும் ஒரு convention ஆகும். அவற்றின் entrypoint scripts, VARNAME_FILE இருப்பதைச் சரிபார்த்து, file-ஐப் படித்து, அதன் உள்ளடக்கத்தைப் பயன்படுத்தும். இது Docker feature அல்ல. எனவே, image இதைச் செயல்படுத்தும் இடங்களில் மட்டுமே இது வேலை செய்யும். SOMETHING_FILE மதிக்கப்படும் என்று கருதுவதற்கு முன், image documentation-ஐச் சரிபார்க்கவும். இதை ஆதரிக்காத applications, startup நேரத்தில் file-ஐத் தாங்களே படிக்கலாம். அல்லது path-ஐ pass செய்து, உங்கள் சொந்த entrypoint மூலம் அதைச் செயல்படுத்தலாம்.

இயங்கும் container-க்குள் இருந்து சரிபார்க்கவும்:

docker compose exec db cat /run/secrets/db_password
docker compose exec db printenv POSTGRES_PASSWORD

முதல் command password-ஐ print செய்யும். இரண்டாவது command எதையும் print செய்யாது, ஏனெனில் அந்த மதிப்பு environment-க்குள் சென்றதே இல்லை. இதுவே இதன் நோக்கம்: இந்த container-ல் docker inspect பாதுகாப்பான path-ஐ மட்டும் காட்டும்.

Host-ல் உள்ள source file-ஐ பாதுகாக்கவும். ஏனெனில் secret-ன் privacy, அதற்குப் பின்னால் உள்ள file-ன் பாதுகாப்பைப் பொறுத்ததே:

chmod 600 db_password.txt

VPS-ல் நடைமுறைக்கு ஏற்ற நடுநிலை அணுகுமுறை

பல self-hosted images _FILE variables-ஐ ஆதரிப்பதில்லை. எனவே, environment variables மட்டுமே பயன்படுத்தக்கூடிய வழியாக இருக்கும். ஒரே administrator கொண்ட VPS-ல் நடைமுறையான இலக்கு, உங்கள் project directory-ல் அனைவரும் படிக்கக்கூடிய file-ல் values இருப்பதைத் தடுப்பதும், அவற்றை git-க்கு வெளியே வைத்திருப்பதும் ஆகும்.

sudo install -o root -g root -m 600 /dev/null /etc/myapp/app.env
sudo nano /etc/myapp/app.env
    env_file:
      - /etc/myapp/app.env

install -m 600 ஏற்கனவே சரியான mode அமைக்கப்பட்ட நிலையில் file-ஐ உருவாக்குகிறது. எனவே, அது அனைவராலும் படிக்கக்கூடியதாக இருக்கும் இடைவெளி ஏற்படாது. அந்த file-க்கு root உரிமையாளராக இருக்கும். ஆகவே, அந்த machine-ல் உள்ள non-root user அதை படிக்க முடியாது. ஆனால் docker இயக்கக்கூடிய எவரும் container-லிருந்து அந்த value-ஐ இன்னும் படிக்க முடியும். *.env மற்றும் .env ஆகியவற்றை .gitignore-ல் சேர்க்கவும். அதற்குப் பதிலாக, key names மற்றும் காலியான values கொண்ட app.env.example-ஐ commit செய்யவும். Commit செய்யப்பட்ட password ஏற்கனவே மாற்றப்பட வேண்டிய password ஆகும்.

ஒரு value-ஐ rotate செய்வது service-ஐ restart செய்வதாகும். Container process தொடங்கும்போது environment variables ஒருமுறை மட்டுமே படிக்கப்படுகின்றன. எனவே, file-ஐத் திருத்துவது மட்டும் எந்த மாற்றத்தையும் ஏற்படுத்தாது. docker compose up -d --force-recreate db இயக்கிய பிறகே மாற்றம் அமலாகும். இதே pattern VPS-ல் HTTPS பின்னால் n8n அமைத்தல் guide-லும் பயன்படுத்தப்படுகிறது. அங்கு encryption key compose file-க்கு வெளியே வைக்கப்படுகிறது.

ஒவ்வொரு environment-க்கும் configuration-ஐ பிரித்தல்

Compose, project directory-லிருந்து இயல்பாக .env-ஐ படிக்கும். --env-file மூலம் அதை வேறு இடத்தைக் குறிப்பிடுமாறு அமைக்கலாம்.

docker compose --env-file .env.staging config

பல files வரிசைப்படி படிக்கப்படும். பின்னர் வரும் files, முன்னர் வந்த files-ன் மதிப்புகளை override செய்யும். Secret அல்லாத default values-ஐ commit செய்யப்பட்ட file-ல் வைத்திருக்கவும். Secrets உள்ள file server-ஐ விட்டு வெளியே செல்லாதபடி பாதுகாக்கவும். இதே விதி env_file:-க்கும் பொருந்தும். ஒரே key பலமுறை இருந்தால், பட்டியலில் கடைசியாக உள்ள file-ன் மதிப்பே பயன்படுத்தப்படும்.

FAQ

எனது .env file container-க்குள் ஏன் புறக்கணிக்கப்படுகிறது?

அது புறக்கணிக்கப்படவில்லை. .env file, compose file-ல் உள்ள ${NAME} placeholders-ஐ மட்டும் substitute செய்கிறது. இது container-க்குள் variables-ஐ ஒருபோதும் அமைக்காது. அந்த value-ஐ container-க்குள் கொண்டு செல்ல, அதை reference செய்யவும்: environment: { KEY: "${NAME}" } அல்லது அதற்கு பதிலாக env_file: ./that-file.env-ஐ பயன்படுத்தவும்.

environment, env_file-ஐ override செய்கிறதா, அல்லது மாறாகவா?

environment: முன்னுரிமை பெறும். Docker-ன் documented order-ல் environment attribute, env_file attribute-ஐவிட மேலானது. இவை இரண்டும் command line-ல் உள்ள docker compose run -e-க்கு கீழே உள்ளன. ஒரே key இரு இடங்களிலும் அமைக்கப்பட்டால், env_file-ல் உள்ள value அமைதியாகப் பயன்படுத்தப்படாமல் விடப்படும்.

Compose பயன்படுத்தும் இறுதி value-ஐ எப்படிப் பார்ப்பது?

அனைத்து interpolation-உம் பயன்படுத்தப்பட்ட fully resolved compose file-ஐ print செய்ய docker compose config-ஐ இயக்கவும். ஏற்கனவே இயங்கும் container-க்கு, அதன் process பெற்றுள்ள சரியான values-ஐ docker inspect <container> --format '{{json .Config.Env}}' காட்டும்.

Compose secrets encrypt செய்யப்படுமா?

இல்லை. File-based secret, /run/secrets/<name> என்ற path-ல் plain file-ஆக container-க்குள் mount செய்யப்படும். Source file host disk-ல் encryption இல்லாமல் இருக்கும். இதன் பயன் encryption அல்ல; scope கட்டுப்பாடாகும். அந்த value container environment-க்கு வெளியிலும், docker inspect output-க்கு வெளியிலும், environment-ஐ print செய்யும் crash dumps-க்கு வெளியிலும் இருக்கும்.

env file-ல் quotes மற்றும் spaces பயன்படுத்தலாமா?

KEY=value with spaces-ஐ பயன்படுத்தி quotes-ஐ விடவும். Compose, அந்த line-ன் மீதமுள்ள முழுப் பகுதியையும் value-ஆகக் கருதும். எனவே quotes பெரும்பாலும் value-க்குள் literal characters-ஆக சேரும். =-ஐச் சுற்றி spaces ஒருபோதும் வைக்க வேண்டாம். இல்லையெனில் key-ன் இறுதியில் trailing space சேர்ந்து, எந்த value-உம் அதனுடன் match ஆகாது.