Docker ile Next.js Uygulamasını Production'a Hazırlamak
Multi-stage build, standalone output ve küçük image boyutları için Next.js projelerinde kullandığım Docker yapılandırmasını paylaşıyorum.
Docker ile Next.js Uygulamasını Production'a Hazırlamak
Next.js uygulamalarını konteynerleştirirken image boyutu ve build süresi kolayca kontrolden çıkabilir. Bu yazıda gerçek bir portfolyo projesinde kullandığım multi-stage Dockerfile yaklaşımını anlatıyorum.
Neden Multi-Stage Build?
Tek aşamalı bir Dockerfile, node_modules, build araçları ve kaynak kodun tamamını nihai image'a taşır. Multi-stage build ile yalnızca çalışma zamanında ihtiyaç duyulan dosyalar (standalone çıktı, statik varlıklar) son image'a kopyalanır.
FROM node:20-alpine AS deps
# bağımlılıkları yükle
FROM node:20-alpine AS builder
# uygulamayı derle
FROM node:20-alpine AS runner
# yalnızca gerekli dosyaları kopyala
output: "standalone" Kullanmak
next.config.ts içinde output: "standalone" ayarı, Next.js'in yalnızca çalışma zamanında ihtiyaç duyulan node_modules alt kümesini otomatik olarak paketlemesini sağlar. Bu tek ayar, image boyutunu yüzde 70'e varan oranda küçültebiliyor.
Root Olmayan Kullanıcı ile Çalıştırmak
Konteyner içinde root kullanıcıyla uygulama çalıştırmak güvenlik açısından risklidir. Ayrı bir sistem kullanıcısı oluşturup uygulamayı bu kullanıcıyla çalıştırmak, konteyner kaçışı senaryolarında etkiyi sınırlar.
Build Zamanı Ortam Değişkenleri
Prisma gibi build sırasında veritabanı bağlantısı bekleyen araçlar için, gerçek olmayan bir DATABASE_URL değeri (dummy connection string) tanımlamak, CI/CD ortamında gereksiz veritabanı bağımlılığını ortadan kaldırır.
Sonuç
Doğru yapılandırılmış bir Dockerfile, hem build sürelerini hem de dağıtım maliyetlerini ciddi oranda azaltır. Bu optimizasyonlara zaman ayırmak, özellikle sık deploy edilen projelerde uzun vadede fark yaratıyor.