استفاده از Profiles در Docker Compose

profiles در Docker Compose برای این است که بعضی سرویس‌ها فقط در شرایط خاص اجرا شوند. یعنی لازم نیست هر بار همه سرویس‌ها بالا بیایند.

به زبان ساده:

پروفایل = دسته‌بندی سرویس‌ها برای اجراهای مختلف

مثلاً:

  • حالت development
  • حالت production
  • ابزارهای debug
  • سرویس‌های اختیاری مثل monitoring

ایده اصلی

فرض کن این سرویس‌ها را داری:

  • api
  • postgres
  • redis
  • adminer (UI برای دیتابیس)
  • prometheus (monitoring)

در development شاید همه را بخواهی. در production شاید فقط بعضی‌ها.

اینجاست که profiles کمک می‌کند.

مثال ساده

services:
  api:
    build: .

  db:
    image: postgres

  adminer:
    image: adminer
    profiles:
      - dev

الان اگر بزنی:

docker compose up

فقط این‌ها بالا می‌آیند:

api
db

چرا؟ چون adminer داخل پروفایل dev است.

اگر بخواهی adminer هم اجرا شود:

docker compose --profile dev up

حالا اجرا می‌شود:

api
db
adminer

چند پروفایل

مثلاً:

services:
  api:
    build: .

  db:
    image: postgres

  redis:
    image: redis
    profiles:
      - cache

  adminer:
    image: adminer
    profiles:
      - dev

حالا چند حالت داریم.

بدون پروفایل:

docker compose up

اجرا می‌شود: api, db

اگر dev:

docker compose --profile dev up

اجرا: api, db, adminer

اگر cache:

docker compose --profile cache up

اجرا: api, db, redis

اگر چند پروفایل:

docker compose --profile dev --profile cache up

اجرا: api, db, adminer, redis

نکته مهم

سرویس‌هایی که profile ندارند همیشه اجرا می‌شوند.

این خیلی مهم است.

پس معمولاً:

بدون profile → core services
با profile → optional services

مثال واقعی development

یک پروژه واقعی:

services:
  api:
    build: .

  db:
    image: postgres

  redis:
    image: redis

  adminer:
    image: adminer
    profiles:
      - dev

  mailhog:
    image: mailhog/mailhog
    profiles:
      - dev

  prometheus:
    image: prom/prometheus
    profiles:
      - monitoring

  grafana:
    image: grafana/grafana
    profiles:
      - monitoring

حالت عادی:

docker compose up

اجرا: api, db, redis

حالت dev:

docker compose --profile dev up

اجرا: api, db, redis, adminer, mailhog

حالت monitoring:

docker compose --profile monitoring up

اجرا: api, db, redis, prometheus, grafana

یک تریک خیلی خوب

می‌توانی profile را با env کنترل کنی.

مثلاً:

COMPOSE_PROFILES=dev
docker compose up

یا داخل .env

COMPOSE_PROFILES=dev

این برای تیم‌ها خیلی خوب است.

فرق profiles با compose override

خیلی‌ها این دو را قاطی می‌کنند.

profiles → فعال/غیرفعال کردن سرویس
override file → تغییر config

مثلاً:

docker-compose.yml
docker-compose.dev.yml

ولی profiles داخل یک فایل است.

یک الگوی خیلی حرفه‌ای

پروژه‌های بزرگ معمولاً این پروفایل‌ها را دارند:

dev
debug
monitoring
worker
tools

مثلاً:

tools:

adminer
pgadmin
redis-insight

debug:

jaeger
zipkin

monitoring:

prometheus
grafana