Mehmet

WFN Üye
Konular
1,851
Mesajlar
1,852
Çözüm
0
Ticaret Puanı
0
Üyelik
1 Ay 6 Gün
Konum
YurtDışı
Web Sitesi
Var
Alanı
Google Adsense
1/1
Konu sahibi
Docker Compose’ta bir servisin başka bir servis başlamadan oluşturulmamasını veya başlatılmamasını depends_on ile tanımlarsınız. Ancak kısa sözdizimi yalnızca başlatma ve durdurma sırasını düzenler; bağımlı servisin gerçekten istek kabul etmeye hazır olduğunu garanti etmez. Veritabanı, kuyruk veya başka bir altyapı servisi için genellikle healthcheck ile birlikte condition: service_healthy kullanmalısınız.

En küçük çalışan örnek​


Bu yalnız test için hazırlanmış örnektir; örnek parolayı canlı ortamda kullanmayın. Buradaki Nginx veritabanını kullanmaz, yalnızca başlatma koşulunu gösterir. Gerçek uygulamada kendi image ve bağlantı ayarlarınızı kullanın. Aşağıdaki dosyada app servisi, db servisine bağlıdır. Compose önce veritabanını başlatır, sağlık kontrolü başarılı olunca uygulamayı başlatır.

Kod:
services:
  db:
    image: postgres:16
    environment:
      POSTGRES_USER: app
      POSTGRES_PASSWORD: example-password
      POSTGRES_DB: appdb
    healthcheck:
      test: ["CMD-SHELL", "pg_isready -U app -d appdb"]
      interval: 5s
      timeout: 3s
      retries: 10

  app:
    image: nginx:alpine
    depends_on:
      db:
        condition: service_healthy

Dosyayı örneğin compose.yaml adıyla kaydedip aynı klasörde şu komutu çalıştırın:

Kod:
docker compose up

Beklenen sonuçta önce db oluşturulur ve sağlık kontrolü geçene kadar beklenir; ardından app başlatılır. Uygulama beklenenden önce başlıyorsa sağlık komutunun ilgili imaj içinde bulunup bulunmadığını ve gerçekten servis hazır olduğunda başarılı sonuç verip vermediğini kontrol edin. depends_on ağ bağlantısı, kimlik doğrulama veya uygulamanın veritabanı şemasının hazır olması gibi işlemleri kendiliğinden çözmez.

Hangi bağımlılık tanımı kullanılmalı?​


Bağımlılığın amacına göre sözdizimini seçin:

İhtiyaçTanımAnlamı
Yalnız başlatma sırasıdepends_on: [db]Compose önce db servisini başlatır; hazır olduğunu doğrulamaz.
Sağlık kontrolü geçince başlatmacondition: service_healthyBağımlı servis sağlıklı duruma gelene kadar bekler.
Tek seferlik iş başarıyla bitince başlatmacondition: service_completed_successfullyMigration veya hazırlık işi sıfır çıkış koduyla tamamlanmalıdır.
Bağımlı servis yeniden oluşturulunca güncellemerestart: trueCompose, db üzerinde açık bir güncelleme veya yeniden başlatma işlemi yaptığında ona bağlı app servisini de yeniden başlatır; db’nin kendi kendine çökmesini izleyen bir politika değildir.

Tablodaki koşullar, uygulamanın kendi yeniden bağlanma davranışının yerine geçmez. Örneğin veritabanı Compose başlatıldıktan sonra çökerse uygulama bağlantıyı yeniden denemelidir.

Migration gibi tek seferlik işlerde kullanım​


Şema hazırlama işini uygulamadan önce çalıştırmak istiyorsanız ayrı bir servis tanımlayabilirsiniz. Aşağıdaki bölüm tek başına çalıştırılacak tam dosya değildir: mevcut db ve healthcheck tanımınıza ekleyin; example.com/my-app:latest ve ./migrate değerlerini kendi uygulamanızın image ve komutuyla değiştirin:

Kod:
services:
  migrate:
    image: example.com/my-app:latest
    command: ./migrate
    depends_on:
      db:
        condition: service_healthy

  app:
    image: example.com/my-app:latest
    depends_on:
      migrate:
        condition: service_completed_successfully

Bu modelde migrate işlemi başarılı bir çıkış koduyla tamamlanmadan app başlatılmaz. Migration hata verirse uygulamanın başlamaması beklenen davranıştır; önce migration günlüklerini inceleyip sorunu düzeltin. Migration işinin yeniden çalıştırıldığında uygulanmış adımları güvenli biçimde tanıdığından emin olun. Bu test dosyasındaki veritabanına kalıcı gerçek veri koymayın; üretimde veri dizini ve yedekleme ayrıca tanımlanmalıdır.

Sık yapılan hatalar​


  • Sadece depends_on ekleyip hazır olma garantisi beklemek: Veritabanı işlemi başlatılmış olabilir ancak bağlantı kabul etmeye henüz hazır olmayabilir. Uygun bir sağlık kontrolü ekleyin.
  • Sağlık kontrolünü yanlış komutla yazmak: test komutu ilgili imajda bulunan bir araç kullanmalı ve servis hazır değilken sıfır olmayan çıkış kodu vermelidir.
  • Servis adı yerine container adı kullanmak: Bağımlılık, Compose dosyasındaki servis adıyla belirtilir; otomatik oluşturulan container adını yazmak gerekmez.
  • Çalışma zamanı hatalarını bağımlılık sırasıyla çözmeye çalışmak: Kimlik bilgileri, ağ adı, port, migration ve uygulama yeniden bağlanma mantığı ayrıca doğru yapılandırılmalıdır.

Kaynaklar​



Sık sorulan sorular​


Bir servis durduğunda ona bağlı servis de otomatik olarak durur mu?​


depends_on öncelikle Compose işlemleri için başlatma ve durdurma sırasını düzenler; çalışma sırasında oluşan her servis arızasını orkestre eden bir izleme sistemi değildir. Uygulamanın hata durumunu ve yeniden bağlanmayı ayrıca tasarlayın.

Healthcheck yazmadan hazır olmayı nasıl anlayabilirim?​


Hazır olma koşulunu uygulamanın kendisiyle doğrulamak en güvenilir yaklaşımdır. Healthcheck kullanamıyorsanız uygulamanın bağlantı hatalarında yeniden denemesi gerekir; yalnızca servis başlatma sırasına güvenmeyin.
 

Sende şimdi bize katılmak ister misin?

Kayıt ol

Bize katılım kolay ve ücretsizdir!

Konuyu görüntüleyenler

Bu konuyu şu anda görüntüleyen üye bulunmuyor.