Dockerfile Oluşturucu

Dockerfile
Sonuçlar

Dockerfile, ayrıntıları hatırlayana kadar kısa görünen dosyalardan biridir: katman sırası önbellek için önemlidir, COPY package.json RUN npm install öncesinde gelir ve derlenen diller çok aşamalı build’den yararlanır. Bu oluşturucu, seçtiğiniz teknoloji için önbellek düzeni baştan doğru olan kullanıma hazır bir Dockerfile yazar.

Dockerfile nasıl oluşturulur

  1. 1

    Teknolojiyi seçin

    Node.js, Python, PHP, Go veya Rust. Her şablon, o dil için uygun bir temel görüntü ve doğru bağımlılık kurma komutunu kullanır.

  2. 2

    Çalışma dizinini ve portu ayarlayın

    WORKDIR ve uygulamanızın dinleyeceği portu seçin; ikisi de oluşturulan dosyaya yazılır.

  3. 3

    Dockerfile'ı inceleyin

    EXPOSE satırının ve başlatma komutunun uygulamanızla eşleştiğini kontrol edin. Go ve Rust şablonları çok aşamalı build kullanır.

  4. 4

    Dockerfile'ı kopyalayın

    Sonucu kopyalayıp deponuzun kök dizinine yapıştırın, ardından görüntüyü derleyin.

Neden çok aşamalı build

Saf bir Dockerfile, derleyici araç zincirinin tamamını son görüntüye kurar. Çok aşamalı build; derlemeyi yapan bir “builder” aşaması ve yalnızca derlenmiş çıktıyı taşıyan bir son aşama sunar:

FROM node:20-alpine AS builder
WORKDIR /app
COPY package*.json ./
RUN npm ci
COPY . .
RUN npm run build

FROM node:20-alpine
WORKDIR /app
COPY --from=builder /app/dist ./dist
COPY --from=builder /app/node_modules ./node_modules
USER node
EXPOSE 3000
CMD ["node", "dist/index.js"]

Son görüntüde tüm geliştirme bağımlılıkları, kaynak dosyalar ve build önbelleği atılır; görüntü boyutu çoğu zaman yüzde 60-80 oranında küçülür.

Temel görüntü çeşitleri

Şablonlar mümkün olduğunca slim veya alpine görüntüleri kullanır. Temel görüntüyü kendiniz ayarlayacaksanız tipik seçenekler şunlardır:

Çeşit Tipik boyut Ne zaman seçilmeli
full 300-900 MB Geliştirme görüntüleri, alışılmadık sistem bağımlılıkları
slim 80-200 MB Çoğu dil için üretim standardı
alpine 30-100 MB Küçük görüntüler, glibc ile musl farkına dikkat
distroless 20-80 MB Maksimum güvenlik; kabuk ve paket yöneticisi yok

Katman önbelleği kuralları

Docker her satırı önbelleğe alır; bir katman değiştiğinde altındaki her şey yeniden derlenir. En az değişenden en çok değişene doğru sıra:

  1. FROM temel görüntüsü (nadiren değişir).
  2. Sistem paketleri (apt-get install), seyrek değişiklikler.
  3. Bağımlılık manifestleri (package.json, requirements.txt, composer.json).
  4. Bağımlılık kurma adımı. Yalnızca manifest değiştiğinde çalışır.
  5. Kaynak kodun kopyalanması. En yoğun katman; sonrasındaki her şey her commit’te yeniden derlenir.
  6. Derleme ve son CMD.

Bu sırayı bozmak, CI build’lerinin yavaşlamasının en yaygın nedenidir.

Güvenlik kontrol listesi

  • Root olmayan kullanıcıyla çalıştırın. Sona doğru USER appuser (veya USER 1000) yazın.
  • Sürümleri sabitleyin. python:3.12.7-slim, python:3.12’den, o da python:latest’ten iyidir.
  • / yerine açık bir WORKDIR belirleyin.
  • Yerel dosyalar için ADD değil COPY kullanın. ADD otomatik açma yan etkilerine sahiptir.
  • Bir HEALTHCHECK ekleyin ki orkestratörler takılan süreci algılayabilsin.
  • Paket önbelleklerini aynı RUN satırında temizleyin: apt-get install ... && rm -rf /var/lib/apt/lists/*.

Sık Sorulan Sorular

Slim, kütüphanelerin önceden derlenmiş wheel’larının çoğu gibi hâlâ glibc tabanlı olduğu için daha güvenli bir varsayılandır. Alpine musl kullanır ve Python (pandas, numpy) veya Node (node-gyp yerel modülleri) içinde ara sıra gizemli çalışma zamanı hatalarına yol açar. Görüntü boyutu kritikse ve teknolojiyi test ettiyseniz alpine seçin.

Evet, projenize bir tane ekleyin. Olmadan Docker, deponuzun tamamını build bağlamı olarak daemon’a gönderir: git geçmişi, node_modules, yerel .env dosyaları, testler. Bu yavaştır, önbelleği boşa harcar ve sırları sızdırır.

Evet. İki mimariyi birden derlemek için docker buildx komutunu --platform seçeneğiyle kullanın. Şablonların kullandığı temel görüntüler arm64 sürümlerini de yayınlar.

Hayır. Seçilen teknoloji, çalışma dizini ve port yalnızca bu sayfada Dockerfile üretmek için kullanılır; hiçbir şey saklanmaz veya paylaşılmaz.

İlgili Araçlar

Araç diğer dillerde mevcuttur