در تعریف متغیرهای محیطی (environment variables) می توانید از آرایه یا دیکشنری استفاده کنید. هر مقدار Boolean (درست، نادرست، بله، خیر) باید در گیومه قرار داده شود تا اطمینان حاصل شود که توسط تجزیه کننده YML به True یا False تبدیل نمی شوند.
متغیرهای محیطی که فقط با کلیدشان تعریف می شوند و مقداری ندارند، برای بدست آوردن مقدار در ماشینی که Compose درحال اجراست به دنبال مقدارشان می گردند. این قابلیت، می تواند برای مقادیری که وابسته به ماشین میزبان متفاوت است و یا برای رمز ها، مفید باشد.
environment:
RACK_ENV: development
SHOW: 'true'
SESSION_SECRET:
نگاهی دقیق به برچسب env_file
در این بخش می خواهیم متغیرهای محیطی را از طریق یک فایل جداگانه به فایل Compose اضافه کنیم. متغیرهای محیطی اضافه شده از طریق فایل، می توانند یک مقدار یا یک لیست باشند.
env_file: .env
دقت داشته باشید، آدرس فایلی که می خواهید در env_file
معرفی کنید، باید به صورت Relative نسبت به آدرس docker-compose.yml
تعریف شود یعنی مبدا آدرس دهی محل قرارگیری فایل compose خواهد بود و از آنجا آدرس دهی را انجام دهید.
env_file:
- ./common.env
- ./apps/web.env
- /opt/runtime_opts.env
نکته ی مهم دیگری که باید توجه داشته باشید این است که اولویت با متغیرهای محیطی تعریف شده در بخش environment
از فایل compose است. و هر متغیری که در بخش environment
نوشته باشید، جایگزین متغیرهای ورودی از env_file
خواهد شد.
نوشتن فایل env
برای نوشتن فایل env بهتر است فایلی را با فرمت env.
بسازید، این فایل می تواند هم بدون نام و هم با نام ساخته شود (مثال از ساخت فایل بدون نام env.
و ساخت فایل با نام web.env). Compose در زمان خواندن این فایل انتظار دارد هر سطر از فایل، شامل زوج اطلاعاتی مانند ENV=VAL
یعنی نام متغیر=مقدار متغیر باشد. همچنین، هر سطری که با # شروع شده باشد به عنوان Comment در نظر گرفته می شود و خوانده نمی شود.
#Set Rails/Rack environment
RACK_ENV=development
هر مقداری که برای یک ENV در نظر بگیرید، به همان شکلی که نوشته اید اعمال می شود. حتی اگر یک مقدار را داخل "" قرار داده باشید با همین گیومه ها منتقل می شود.
⚠ به خاطر داشته باشید که ترتیب فایل هایی که در برچسب env_file
می نویسید، در تعیین مقدار اختصاص داده شده به متغیری که بیش از یک بار تعریف شده است، مهم خواهد بود. فایل های موجود در لیست env_file
، از بالا به پایین پردازش می شوند. برای مثلا فرض کنید متغیر مشابهی را در فایل های a.env
و b.env
تعریف کرده اید و مقدارهای متفاوتی را به آن ها اختصاص داده اید، در این شرایط اگر b.env
در زیر فهرست شده باشد، مقدار تعریف شده در b.env
برای متغیر مشترک باقی می ماند و اعمال می شود. مثالی که در بالا به آن اشاره کردیم را می توانید در ادامه مشاهده کنید.
فایل docker-compose.yml
به صورت زیر تعریف شده است:
services:
some-service:
env_file:
- a.env
- b.env
و فایل a.env
متغیری با نام VAR
دارد که مقدار 1 به آن اختصاص داده شده است:
# a.env
VAR=1
و فایل b.env
هم به صورت زیر تعریف شده است:
# b.env
VAR=Hello
در این شرایط مقدار متغیر VAR
برابر Hello خواهد بود.