SSD Nodes Learn RAM 8GB — $66/mwaka
Mwongozo Matt ConnorNa Matt Connor · Imeboreshwa 2026-08-01

Docker Compose: .env, env_file na environment

Jifunze tofauti kati ya .env, env_file na environment katika Docker Compose, mpangilio wa kipaumbele, na kwa nini siri kama nywila hazipaswi kuwekwa kwenye env.

Vitu vitatu vinavyoitwa env file

Docker Compose ina mifumo mitatu tofauti yenye majina yanayofanana na yanaweza kuchanganya. Faili ya .env hujaza vishikilia nafasi vya ${VARIABLE} ndani ya compose.yaml yenyewe, kabla Compose haijasoma faili hiyo. Sifa ya env_file: hupakia faili yenye jozi za key/value kwenye mazingira ya container. Sifa ya environment: huweka vigezo moja kwa moja kwenye container, vilivyoandikwa katika faili ya compose. Mifumo hii haiwezi kubadilishana. Miwili kati yake inapoweka key moja, inayoshinda huamuliwa na mpangilio wa kipaumbele ulioandikwa kwenye nyaraka.

Mwongozo huu unaonyesha kila mfumo ukifanya kazi, unathibitisha kipaumbele hicho kwa command unayoweza kuendesha, kisha unashughulikia jambo muhimu zaidi: vigezo vya mazingira vinaweza kusomwa na mtu yeyote anayeweza kuendesha docker inspect, kwa hiyo nywila hazipaswi kuwekwa humo. Ikiwa wewe ni mgeni katika faili za compose kwa ujumla, anza na Misingi ya Docker Compose kwenye VPS kisha urudi hapa kwa ajili ya usanidi.

Faili ya .env ni ya faili ya compose, si ya kontena

Unda saraka na uweke faili mbili ndani yake.

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

Sasa iulize Compose kuhusu kile ilichochanganua hasa.

docker compose config

Matokeo yanaonyesha image: alpine:3.20. Kishikilia nafasi kimeondolewa kwa sababu uingizaji ulifanyika wakati wa kuchanganua. Compose hutafuta .env katika saraka ya mradi, ambayo ni saraka iliyo na faili ya compose, kisha hubadilisha kila ${NAME} inayopata.

Kisha endesha huduma.

docker compose run --rm demo

printenv ALPINE_TAG hutoka ikiwa na hali 1 na haichapishi chochote. Kigeu hakipo ndani ya kontena. Hili ndilo jambo linalochanganywa mara nyingi zaidi: .env iliisanidi faili ya compose, si mchakato. Faili ya .env iliyo na POSTGRES_PASSWORD=hunter2 ndani yake haifanyi chochote kwa hifadhidata yako isipokuwa sehemu fulani ya faili ya compose iirejelee.

${NAME:-default} hutoa thamani mbadala wakati kigeu hakijawekwa au kiko tupu. ${NAME:?message} huifanya Compose ikatae kuanza na ichapishe ujumbe wako. Hili ndilo chaguo sahihi kwa thamani ambayo haina chaguo-msingi salama.

env_file hupakia vigezo kwenye kontena

Sifa ya env_file: hutaja faili moja au zaidi ambazo maudhui yake huwa vigezo vya mazingira vya kontena.

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

Hii huchapisha from_env_file. Muundo wa faili ni mistari ya kawaida ya KEY=value, mstari mmoja kwa kila kigezo, huku # ikianza maelezo ya kutenga. Si shell. Alama za nukuu kwa kawaida huhifadhiwa kama sehemu ya thamani, na viambishi vya export havihitajiki. Usiweke nafasi kuzunguka alama ya =, kwa sababu KEY = value huunda kigezo kinachoitwa KEY kihalisi, chenye nafasi ya mwanzo katika thamani yake.

Njia ya env_file ambayo haipo ni hitilafu, na Compose husitisha utendaji. Iweke kuwa ya hiari ikiwa faili inaweza kukosekana kihalali:

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

environment huweka vigeu ndani ya mstari

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

Sintaksia mbili zinakubaliwa: muundo wa ramani ulio hapo juu na muundo wa orodha unaotumia - GREETING=from_environment. Hufanya kazi kwa njia ileile. Muundo wa orodha una ujanja mmoja wa ziada: ufunguo usio na thamani hupitisha kigeu kutoka kwenye shell ambako uliendesha docker compose.

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

Hiyo huchapisha from_my_shell. Ukiendesha bila kuweka GREETING kwenye shell, Compose haiweki chochote wala haitoi onyo. Kushindwa kwa upitishaji bila taarifa ni jambo muhimu la kujua, kwa sababu huduma inayoanza ikiwa na kigeu cha nenosiri tupu mara nyingi huanza bila matatizo na huwa wazi kabisa.

Ni ipi hushinda

Docker inaeleza mpangilio wa kipaumbele, kuanzia wa juu zaidi: docker compose run -e kwenye mstari wa amri, kisha environment au env_file ambazo thamani yake huingizwa kutoka kwenye shell yako au faili ya mazingira, kisha environment ya kawaida kwenye faili ya Compose, kisha env_file, na hatimaye direktiva ya ENV iliyojumuishwa kwenye image.

Kwa matumizi ya kila siku, kanuni fupi ni hii: environment: hushinda env_file:, na -e kwenye mstari wa amri hushinda zote mbili. Thibitisha hilo katika faili moja.

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

Ya kwanza huchapisha from_environment, kwa hiyo environment: ilibatilisha thamani iliyo katika app.env. Ya pili huchapisha from_cli. Hakuna chochote katika faili ya Compose kinachobatilisha mstari wa amri.

Container inapofanya kazi kana kwamba usanidi wako haukutumika, usikisie. docker compose config huchapisha faili iliyotatuliwa kikamilifu, na docker compose config --environment huchapisha vigezo vya uingizaji ambavyo Compose inatumia. Ripoti nyingi za “faili yangu ya mazingira imepuuzwa” husababishwa na thamani kuwekwa mara mbili katika viwango viwili tofauti.

Kwa nini vigeu vya mazingira huvuja

Weka nenosiri katika environment:, nalo huhifadhiwa kwenye usanidi wa kontena kwenye diski na kuonekana kwa mtumiaji yeyote aliye katika kikundi cha docker.

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

Matokeo yana "DB_PASSWORD=hunter2" katika maandishi wazi. Njia nyingine tatu zinaonyesha thamani hiyo hiyo. docker compose config huiliandika kwenye terminal, na hivyo thamani hiyo huishia kubandikwa kwenye jukwaa la usaidizi. Mchakato wowote ndani ya kontena unaweza kusoma /proc/1/environ, na kila mchakato wa mtoto hurithi kigeu hicho. Pia, vidhibiti vya kuanguka kwa programu mara kwa mara hutupa mazingira yote kwenye kumbukumbu ya kumbukumbu au ripoti ya hitilafu.

Uanachama wa kikundi cha docker kwa vitendo ni sawa na kuwa root kwenye mwenyeji, kwa hiyo huwezi kutegemea kikomo hiki cha mamlaka. Mwongozo kuhusu akaunti za watumiaji zenye mamlaka kidogo kwenye VPS unaeleza kwa nini ni muhimu kuzuia uanachama wa kikundi hicho kwenye seva inayoshirikiwa.

Siri za Compose huhifadhi thamani katika faili

Compose inasaidia siri zinazotegemea faili. Thamani huwekwa ndani ya container kama faili badala ya kuingizwa kwenye mazingira.

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

Siri huwekwa kwenye /run/secrets/db_password ndani ya container. Jina lililo baada ya mkwaju ni jina la siri kutoka kwenye kizuizi cha kiwango cha juu cha secrets:.

Kiambishi _FILE ni kanuni inayotumiwa na Docker Official Images, ikijumuisha postgres, mysql na mariadb. Skripti hizo za entrypoint hukagua VARNAME_FILE, husoma faili, kisha hutumia yaliyomo. Hiki si kipengele cha Docker, kwa hiyo hufanya kazi tu pale ambapo image imekitekeleza. Kagua nyaraka za image kabla ya kudhani kuwa SOMETHING_FILE itatambuliwa. Programu zisizokisaidia mara nyingi zinaweza kusoma faili hiyo zenyewe wakati wa kuanza, au unaweza kupitisha njia ya faili na kuacha entrypoint yako yenyewe ishughulikie.

Thibitisha ukiwa ndani ya container inayoendesha:

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

Ya kwanza huchapisha nenosiri. Ya pili haichapishi chochote, kwa sababu thamani haikuingia kwenye mazingira. Hilo ndilo lengo: docker inspect kwenye container hii huonyesha tu njia ya faili isiyo na madhara.

Linda faili chanzo kwenye host, kwa sababu siri huwa ya faragha kwa kiwango kilekile ambacho faili inayoihifadhi ni ya faragha:

chmod 600 db_password.txt

Suluhisho la kati lenye utendaji kwenye VPS

Picha nyingi zinazojipangia hazitumii vigezo vya _FILE, kwa hiyo vigezo vya mazingira ndiyo njia pekee ya kuingiza thamani. Kwenye VPS moja inayosimamiwa na msimamizi mmoja, lengo halisi ni kuzuia thamani kukaa kwenye faili inayoweza kusomwa na kila mtu ndani ya saraka ya mradi wako, na kuizuia isiingie kwenye 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 huunda faili ikiwa na mode iliyowekwa tayari, kwa hiyo hakuna muda ambapo kila mtu anaweza kuisoma. root ndiye mmiliki wake, kwa hiyo mtumiaji asiye root kwenye mashine hiyo hawezi kuisoma, ingawa mtu yeyote anayeweza kuendesha docker bado anaweza kusoma thamani hiyo kutoka kwenye kontena. Ongeza *.env na .env kwenye .gitignore, kisha ucommit app.env.example iliyo na majina ya funguo na thamani tupu badala yake. Nenosiri lililocommitiwa ni nenosiri linalopaswa kubadilishwa.

Kubadilisha thamani kunamaanisha kuwasha upya huduma. Vigezo vya mazingira husomwa mara moja mchakato wa kontena unapoanza, kwa hiyo kuhariri faili hakubadilishi chochote hadi uendeshe docker compose up -d --force-recreate db. Huu ndio utaratibu unaotumiwa pia kwenye mwongozo wa n8n nyuma ya HTTPS kwenye VPS, ambapo ufunguo wa usimbaji fiche huhifadhiwa nje ya faili ya compose.

Kugawanya usanidi kwa kila mazingira

Compose husoma .env kutoka kwenye saraka ya mradi kwa chaguo-msingi. Elekeza .env mahali pengine kwa kutumia --env-file.

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

Faili nyingi husomwa kwa mpangilio, na faili za baadaye hubatilisha za awali. Hifadhi chaguo-msingi zisizo siri kwenye faili iliyowekwa kwenye mfumo wa udhibiti wa matoleo, na hifadhi siri kwenye faili ambayo haitoki kamwe kwenye seva. Hali hiyo inatumika pia kwa env_file:, ambapo faili ya mwisho iliyoorodheshwa ndiyo inayotumika kwa ufunguo unaojirudia.

FAQ

Kwa nini faili yangu .env imepuuzwa ndani ya kontena?

Haijapuuzwa. Faili ya .env hubadilisha tu nafasi za ${NAME} katika faili ya compose. Haiweki kamwe vigezo ndani ya kontena. Ili kuingiza thamani kwenye kontena, irejelee: environment: { KEY: "${NAME}" }, au tumia env_file: ./that-file.env badala yake.

Je, environment inabatilisha env_file, au ni kinyume chake?

environment: ndiyo hutangulia. Mpangilio ulioandikwa wa Docker unaweka sifa ya environment juu ya sifa ya env_file, na zote ziko chini ya docker compose run -e kwenye mstari wa amri. Ikiwa ufunguo umewekwa katika sehemu zote mbili, thamani katika env_file haitumiki bila taarifa.

Ninaonaje thamani ya mwisho ambayo Compose itatumia?

Endesha docker compose config ili kuchapisha faili ya compose iliyotatuliwa kikamilifu, pamoja na uingizaji wote wa thamani. Kwa kontena ambalo tayari linafanya kazi, docker inspect <container> --format '{{json .Config.Env}}' huonyesha hasa kile ambacho mchakato wake ulipokea.

Je, siri za Compose zimesimbwa kwa njia fiche?

Hapana. Siri inayotegemea faili huwekwa ndani ya kontena kama faili ya kawaida kwenye /run/secrets/<name>, na faili chanzo hukaa kwenye diski ya seva mwenyeji bila usimbaji fiche. Faida ni udhibiti wa upeo, si usimbaji fiche: thamani hubaki nje ya mazingira ya kontena, nje ya matokeo ya docker inspect, na nje ya nakala za kumbukumbu za hitilafu zinazoonyesha mazingira.

Je, ninaweza kutumia alama za kunukuu na nafasi katika faili ya env?

Tumia KEY=value with spaces na uache alama za kunukuu. Compose huchukulia sehemu yote iliyobaki ya mstari kuwa thamani, kwa hiyo alama za kunukuu kwa kawaida huwa vibambo halisi katika thamani. Usiweke kamwe nafasi kuzunguka =, kwa sababu ufunguo utakuwa na nafasi ya mwisho na hakuna kitu kitakacholingana nao.