چرا سکان آکادمی؟
نگاهی دقیق به برچسب های environment و env_file در services

نگاهی دقیق به برچسب های environment و env_file در services

در تعریف متغیرهای محیطی (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 خواهد بود.

دوره در حال تکمیل است ... rocket