Pernah nggak, kamu susah payah membangun aplikasi Laravel di Docker, lalu tiba-tiba data hilang begitu container di-restart? Atau lebih parah — kamu nggak sengaja commit file .env ke GitHub dan semua API key serta password database kamu terekspos ke publik? 😱
Nah, di artikel ke-9 seri Docker from Zero to Zorro ini, kita akan bahas tuntas cara mengelola env storage Laravel Docker dengan aman dan profesional. Kamu akan belajar cara pakai .env yang benar, bikin storage persistent lewat Docker volume, dan memastikan data kamu tidak pernah hilang meski container mati. Let's go! 🚀
🔐 Kenapa File .env Harus Dikelola Khusus di Docker?
Bayangkan .env seperti kunci brankas rumahmu. Kamu nggak akan simpan salinannya di tempat umum kan? Nah, sama dengan Docker — kamu tidak boleh "membakar" isi .env ke dalam Docker image, karena image itu bisa dibagikan, di-push ke registry, atau diakses orang lain.
Masalah umum yang sering terjadi saat mengelola env storage Laravel Docker:
.env yang tidak sengaja di-commit. Pastikan .env selalu ada di .gitignore!⚙️ Cara Aman Mengatur File .env Laravel di Docker
Untuk mengelola env Laravel di Docker dengan aman, kamu punya dua pilihan utama: menggunakan env_file di docker-compose, atau mengoper environment variables satu per satu. Kita akan pakai pendekatan pertama yang lebih clean dan mudah dikelola.
.env berisi nilai asli (masuk .gitignore), sedangkan .env.example adalah template kosong yang bisa di-commit ke repo.APP_ENV=local
APP_KEY=base64:YOUR_KEY_HERE
APP_DEBUG=true
APP_URL=http://localhost
# Database
DB_CONNECTION=mysql
DB_HOST=mysql
DB_PORT=3306
DB_DATABASE=laravel_db
DB_USERNAME=laravel_user
DB_PASSWORD=secret_password
.env tidak ikut masuk ke Git repo maupun Docker image..env
.env.production
.env.staging
# Jangan masukkan ke Docker image
.env*
.git
node_modules
storage/logs
.env ke dalam container adalah via opsi env_file di docker-compose.services:
app:
build:
context: .
dockerfile: Dockerfile
env_file:
- .env # ← inject dari file ini
volumes:
- ./storage:/var/www/html/storage
- laravel_storage:/var/www/html/storage/app
ports:
- "8000:80"
volumes:
laravel_storage:
.env.development, .env.production, dan seterusnya. Lalu di docker-compose, referensikan yang sesuai: env_file: .env.production. Clean banget!💾 Mengelola Storage Laravel agar Persistent dengan Docker Volume
Sekarang kita masuk ke bagian yang sering bikin pemula panik: storage yang hilang saat container di-restart. Ingat analoginya — container Docker itu seperti hotel. Begitu kamu checkout (container stop/remove), semua yang kamu tinggal di kamar hotel itu lenyap. Solusinya? Docker Volume — seperti titip barang di loker hotel yang tetap ada meski kamu ganti kamar.
Folder storage Laravel menyimpan banyak hal penting: uploaded files, logs, cache, session. Semua ini harus tetap ada meski container di-recreate.
├── app/ # ← File upload user (WAJIB persist)
│ ├── public/ # ← Gambar, dokumen publik
├── framework/ # ← Cache, session, views
│ ├── cache/
│ ├── sessions/
│ └── views/
└── logs/ # ← Log aplikasi (persist untuk debugging)
services:
app:
build: .
env_file: .env
volumes:
# Bind mount untuk development
- .:/var/www/html
# Named volume untuk storage persistence
- laravel_storage:/var/www/html/storage/app
- laravel_logs:/var/www/html/storage/logs
ports:
- "8000:80"
mysql:
image: mysql:8.0
env_file: .env
volumes:
- mysql_data:/var/lib/mysql
volumes:
laravel_storage:
laravel_logs:
mysql_data:
# ... install dependencies ...
WORKDIR /var/www/html
COPY . .
# Set permission storage (PENTING!)
RUN chown -R www-data:www-data storage bootstrap/cache \
&& chmod -R 775 storage bootstrap/cache
EXPOSE 80
storage/app/public bisa diakses via URL.docker compose exec app php artisan storage:link
# Output yang diharapkan:
# The [public/storage] link has been connected to [storage/app/public].
.:/var/www/html) untuk development, folder storage dari host akan menimpa volume. Untuk production, sebaiknya hanya pakai named volume tanpa bind mount ke seluruh project directory. Ini mencegah konflik permission yang menyebalkan!🔒 Best Practice Keamanan env Storage Laravel Docker
Sekarang kamu sudah tahu cara kerjanya. Tapi untuk benar-benar aman dalam mengelola env storage Laravel Docker, ada beberapa best practice yang wajib kamu terapkan — terutama saat sudah masuk ke environment production.
- Gunakan bind mount untuk hot-reload kode
- APP_DEBUG=true boleh diaktifkan
- Named volume untuk storage/app saja
- .env boleh lebih longgar (DB lokal)
- Tidak ada bind mount — hanya named volume
- APP_DEBUG=false wajib!
- Gunakan Docker Secrets atau env manager
- Password DB harus kompleks dan di-rotate rutin
docker compose exec app env | grep APP_
# Cek apakah .env sudah ter-inject dengan benar
docker compose exec app php artisan config:show app
# Lihat isi volume storage
docker volume inspect nama_project_laravel_storage
# List semua volume
docker volume ls
# Clear cache setelah update .env
docker compose exec app php artisan config:clear
.env, jalankan docker compose restart app agar perubahan diambil ulang oleh container. Atau lebih elegan: docker compose up -d --force-recreate.