"Benim makinemde çalışıyordu" cümlesini bir daha duymamak için Docker'ı projelerime dahil ettiğimden beri, geliştirme ve üretim ortamları arasındaki farklardan kaynaklanan sorunlar ciddi şekilde azaldı.
Multi-Stage Build Kullanmak
Tek aşamalı bir Dockerfile, SDK'nın tüm ağırlığını üretim imajına da taşıyor. Multi-stage build ile, derleme SDK imajında yapılıp, sadece çalıştırma için gereken runtime imajına kopyalanıyor:
FROM mcr.microsoft.com/dotnet/sdk:8.0 AS build
WORKDIR /src
COPY . .
RUN dotnet publish -c Release -o /app
FROM mcr.microsoft.com/dotnet/aspnet:8.0
WORKDIR /app
COPY --from=build /app .
ENTRYPOINT ["dotnet", "MyApi.dll"]
Katman Önbelleğini Doğru Kullanmak
Önce sadece .csproj dosyalarını kopyalayıp dotnet restore çalıştırmak, kaynak kod değişse bile paket geri yüklemenin tekrar tekrar çalışmasını engelliyor. Bu, build sürelerini ciddi şekilde kısaltıyor.
Ortam Değişkenleriyle Konfigürasyon
Bağlantı dizeleri gibi ortama özgü ayarları imaja gömmek yerine, ortam değişkenleri (ASPNETCORE_ENVIRONMENT, connection string'ler) üzerinden enjekte ediyorum. Bu, aynı imajın farklı ortamlarda (test, staging, production) değişiklik yapmadan kullanılabilmesini sağlıyor.
Sağlık Kontrolü (Health Check) Eklemek
Orkestratörün (Docker Compose, Kubernetes) konteynerin gerçekten sağlıklı çalışıp çalışmadığını anlayabilmesi için /health endpoint'i ekliyorum; bu, sorunlu bir konteynerin fark edilmeden trafik almaya devam etmesini engelliyor.
Sonuç
Docker, .NET uygulamalarını taşınabilir ve tutarlı hale getiriyor. Multi-stage build ve katman önbelleğini doğru kullanmak, hem imaj boyutunu küçültüyor hem de geliştirme döngüsünü hızlandırıyor.