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=localhostDB_PORT=5432APP_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:
.envbukan 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 umumdev.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:
- Environment variable dari CLI (
APP_ENV=prod docker compose up) environmentdidocker-compose.ymlenv_file- File
.env - Default value (
${VAR:-default})
Memahami urutan ini penting untuk menghindari konfigurasi yang tidak terduga.
Environment Variable vs Build Argument #
Sering tertukar, tapi fungsinya berbeda:
| Aspek | ENV | ARG |
|---|---|---|
| Digunakan saat | Runtime | Build time |
| Tersedia di container | Ya | Tidak |
| Cocok untuk | Konfigurasi | Build 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 #
- Mengira
.envotomatis masuk ke container tanpaenv_file - Menyimpan secret di repository
- Nama variable tidak konsisten
- Tidak memahami precedence
- 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.