Ana içeriğe geç

Docker Image ve Container

Image nasıl oluşturuluyor

Frontend ve backend ayrı imajlardır, ikisi de docker-compose.yml içindeki build: bloklarından derlenir; harici bir registry'den çekilmez.

İmaj Dockerfile Build context
Backend iqvflex/backend/Dockerfile ./iqvflex/backend
Frontend dashboard/Dockerfile ./dashboard

Backend imajı

node:22-alpine tabanlı, çok aşamalı (base → deps → runtime) build:

  • deps aşamasında yalnızca package.json / package-lock.json kopyalanır, npm ci --omit=dev ile üretim bağımlılıkları kurulur (kaynak değişince bu katman yeniden kullanılır — hızlı rebuild).
  • runtime aşamasında node_modules, app.js, server.js, src/ kopyalanır; container root olarak çalışmaz (USER node). EXPOSE 3001.
  • Container içi HEALTHCHECK, install/update betikleriyle aynı mantığı kullanır: gerçek HTTP 200 + data.status === 'ok' (/health).

Frontend imajı

İki aşamalı: node:22-alpine (build) ile derleme, nginx:1.27-alpine (runtime) ile sunum. Çalışma imajında Node veya kaynak kod bulunmaz (küçük ve dar yüzeyli imaj).

  • build aşamasında npm ci (devDependencies dahil — vite/typescript derleme için gerekli), VITE_API_BASE_URL build-arg'ı (Docker'da boş) ile npm run build (tsc && vite build) çalışır.
  • runtime aşamasında yalnızca dist/ çıktısı, nginx.conf ve proxy_params.conf kopyalanır. EXPOSE 80.
  • Container içi HEALTHCHECK: wget ile http://127.0.0.1/__nginx_health (backend'e vekillenmeyen, nginx'in kendi ucu).

Production image yaklaşımı

Aynı imajlar hem geliştirme hem üretimde kullanılır; üretime özgü sıkılaştırma (salt okunur dosya sistemi, port kapatma, kaynak sınırı) imaj seviyesinde değil, docker-compose.prod.yml override'ında uygulanır (bkz. Docker Mimarisi).

Image tag / versiyon mantığı

image: ${COMPOSE_PROJECT_NAME:-iqvflex}-backend:${VERSION:-latest}
image: ${COMPOSE_PROJECT_NAME:-iqvflex}-frontend:${VERSION:-latest}

VERSION ortam değişkeni doldurulmazsa imajlar latest etiketiyle derlenir. install.sh / update.sh, depo kökündeki VERSION dosyasını (canonical SemVer sürüm, örn. 1.0.0) okuyup bu değeri VERSION ortam değişkeni olarak kullanır — imaj etiketi ile depo sürümü bu şekilde eşleşir. dashboard/package.json ve iqvflex/backend/package.json içindeki sürümler bileşen düzeyindedir, imaj etiketinde kullanılmaz.