Environment Variable #

Environment variable adalah salah satu fondasi utama dalam praktik containerization modern. Dengan environment variable, kita bisa memisahkan konfigurasi dari kode aplikasi, sehingga image Docker tetap generik, reusable, dan aman digunakan di berbagai environment (development, staging, production).

Docker Compose menyediakan beberapa cara yang fleksibel untuk mendefinisikan dan mengelola environment variable, mulai dari inline definition, file .env, hingga integrasi dengan secret management.

Artikel ini akan membahas secara lengkap, rinci, dan praktis:

  • Apa itu environment variable dalam konteks Docker Compose
  • Cara mendefinisikannya
  • Urutan prioritas (precedence)
  • Best practice penggunaan di dunia nyata
  • Kesalahan umum yang sering terjadi

Apa Itu Environment Variable? #

Environment variable adalah pasangan key-value yang disediakan ke proses aplikasi saat runtime.

Contoh sederhana:

  • DB_HOST=localhost
  • DB_PORT=5432
  • APP_ENV=production

Dalam container:

  • Aplikasi tidak hardcode konfigurasi
  • Image tetap sama, yang berubah hanya environment variable

Ini sangat sejalan dengan prinsip Twelve-Factor App.


Peran Environment Variable di Docker Compose #

Docker Compose berfungsi sebagai orchestrator lokal yang:

  • Menjalankan banyak container
  • Mengatur networking
  • Mengatur dependency antar service
  • Menyuntikkan environment variable ke masing-masing service

Dengan Compose, environment variable bisa digunakan untuk:

  • Konfigurasi aplikasi (port, mode, feature flag)
  • Kredensial database atau third-party service
  • Mengatur perilaku image yang sama di environment berbeda

Cara Mendefinisikan Environment Variable di Docker Compose #

Menggunakan environment (Inline) #

services:
  app:
    image: myapp:latest
    environment:
      APP_ENV: production
      APP_PORT: 8080

Atau format list:

environment:
  - APP_ENV=production
  - APP_PORT=8080

Kelebihan:

  • Jelas dan eksplisit
  • Mudah dibaca

Kekurangan:

  • Tidak cocok untuk secret
  • Sulit dikelola jika jumlah variable banyak

Menggunakan File .env #

Docker Compose secara default akan membaca file .env di direktori yang sama dengan docker-compose.yml.

Contoh .env:

APP_ENV=production
APP_PORT=8080
DB_HOST=db
DB_USER=appuser
DB_PASSWORD=secret

Contoh penggunaan di docker-compose.yml:

services:
  app:
    image: myapp:latest
    environment:
      APP_ENV: ${APP_ENV}
      APP_PORT: ${APP_PORT}

Atau otomatis:

services:
  app:
    image: myapp:latest
    env_file:
      - .env

Catatan penting:

  • .env bukan untuk production secret
  • Biasanya di-gitignore

Menggunakan env_file #

Kita bisa memisahkan environment variable berdasarkan konteks:

services:
  app:
    image: myapp:latest
    env_file:
      - env/common.env
      - env/production.env

Docker Compose akan membaca file secara berurutan.

Use case umum:

  • common.env → konfigurasi umum
  • dev.env / staging.env / prod.env → spesifik environment

Variable Substitution #

Docker Compose mendukung variable substitution:

services:
  app:
    image: myapp:${APP_VERSION}
    ports:
      - "${APP_PORT}:8080"

Jika tidak diset:

image: myapp:${APP_VERSION:-latest}

Manfaat:

  • Compose file lebih dinamis
  • Satu file untuk banyak environment

Urutan Prioritas Environment Variable (Precedence) #

Dari tertinggi ke terendah:

  1. Environment variable dari CLI (APP_ENV=prod docker compose up)
  2. environment di docker-compose.yml
  3. env_file
  4. File .env
  5. Default value (${VAR:-default})

Memahami urutan ini penting untuk menghindari konfigurasi yang tidak terduga.


Environment Variable vs Build Argument #

Sering tertukar, tapi fungsinya berbeda:

AspekENVARG
Digunakan saatRuntimeBuild time
Tersedia di containerYaTidak
Cocok untukKonfigurasiBuild logic

Contoh ARG:

ARG APP_VERSION
RUN echo $APP_VERSION

Contoh ENV:

ENV APP_ENV=production

Best Practice Environment Variable di Docker Compose #

1. Jangan Hardcode Secret #

❌ Jangan:

environment:
  DB_PASSWORD: supersecret

✅ Gunakan:

  • .env (lokal)
  • Docker secrets
  • External secret manager (Vault, AWS SSM, GCP Secret Manager)

2. Pisahkan Konfigurasi per Environment #

Struktur yang umum:

.
├── docker-compose.yml
├── docker-compose.override.yml
├── env/
│   ├── common.env
│   ├── dev.env
│   └── prod.env

3. Gunakan Nama Variable yang Konsisten #

APP_ENV
APP_PORT
DB_HOST
DB_PORT
DB_USER
DB_PASSWORD

Konsistensi memudahkan:

  • Dokumentasi
  • Debugging
  • Onboarding engineer baru

4. Dokumentasikan Semua Environment Variable #

Minimal buat satu file:

.env.example

Berisi:

APP_ENV=
APP_PORT=
DB_HOST=
DB_USER=
DB_PASSWORD=

5. Jangan Mengandalkan .env untuk Production #

.env cocok untuk:

  • Local development
  • Proof of concept

Untuk production:

  • Inject via CI/CD
  • Gunakan secret manager
  • Gunakan orchestrator (Swarm, Kubernetes)

Kesalahan Umum yang Sering Terjadi #

  1. Mengira .env otomatis masuk ke container tanpa env_file
  2. Menyimpan secret di repository
  3. Nama variable tidak konsisten
  4. Tidak memahami precedence
  5. Menggunakan ENV untuk data sensitif jangka panjang

Penutup #

Environment variable adalah kunci fleksibilitas Docker Compose. Dengan pemahaman yang baik:

  • Image menjadi reusable
  • Konfigurasi lebih aman
  • Deployment lebih rapi dan terkontrol

Docker Compose menyediakan banyak opsi, namun best practice dan disiplin penggunaan yang akan menentukan kualitas arsitektur container kita.

About | Author | Content Scope | Editorial Policy | Privacy Policy | Disclaimer | Contact