- Konu sahibi
- #1
Docker Compose’ta bir servisin başka bir servis başlamadan oluşturulmamasını veya başlatılmamasını
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
Dosyayı örneğin
Beklenen sonuçta önce
Bağımlılığın amacına göre sözdizimini seçin:
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.
Ş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:
Bu modelde
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.
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ım | Anlamı |
|---|---|---|
| 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şlatma | condition: service_healthy | Bağımlı servis sağlıklı duruma gelene kadar bekler. |
| Tek seferlik iş başarıyla bitince başlatma | condition: service_completed_successfully | Migration veya hazırlık işi sıfır çıkış koduyla tamamlanmalıdır. |
| Bağımlı servis yeniden oluşturulunca güncelleme | restart: true | Compose, 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_onekleyip 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:
testkomutu 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.