Kısa cevap
Bir Docker konteyneri hemen kapandığında önce `docker logs` ve çıkış kodunu kontrol edin. En yaygın nedenler yanlış başlatma komutu, hemen sonlanan uygulama, eksik yapılandırma veya izin ve ön planda çalışacak bir şeyi olmayan konteynerdir. Komutu veya entrypoint'i düzeltin ve hatayı görmek için konteyneri etkileşimli olarak başlatın.
Sorun nasıl anlaşılır
- `docker ps` konteyneri göstermiyor, ancak `docker ps -a` onu Exited olarak listeliyor
- Konteyner başlatılıyor ve saniyeler içinde kayboluyor
- Günlüklerde hiçbir şey yok veya yalnızca başlangıçta bir hata mesajı var
- Uygulama yerel olarak çalışıyor, ancak konteynerde hemen çıkıyor
- Çıkış kodu 0, 1, 127 veya 137
En yaygın nedenler
Yanlış başlatma komutu veya entrypoint
Dockerfile'da veya `docker run` komutunda var olmayan bir komut belirtilmişse konteyner 127 koduyla çıkar. Yürütülebilir dosyanın yolu doğru mu ve komut Docker'ın beklediği biçimde mi kontrol edin.
Uygulama hemen sonlanıyor
Konteyner, ana süreç çalıştığı sürece yaşar. Uygulama yalnızca bir iş yapıp sonlanıyorsa veya arka planda başlatılmışsa konteyner kapanır. Ana sürecin ön planda kalması gerekir.
Eksik yapılandırma veya izin
Uygulama ortam değişkenleri, yapılandırma dosyası veya yazma izni yoksa çökebilir. Günlüklerde genellikle başlangıçta bir hata görülür, örneğin veritabanına erişilemiyor veya dosya yok.
Bağlantı noktası veya kaynaklar
Bağlantı noktası kullanımdaysa başlatma, bağlantı noktasının zaten kullanımda olduğu mesajıyla başarısız olabilir. Yeterli bellek yoksa veya süreç sınırlar nedeniyle sonlandırıldıysa konteyner çıkabilir.
Servisler arası bağımlılık
Docker Compose ortamında, bağımlı olduğu servis hazır değilse konteyner başlamayabilir veya çıkabilir. `depends_on` içindeki sırayı ve koşulları kontrol edin, bağımlı servisin gerçekten hazır olup olmadığını doğrulamak için healthcheck kullanın.
Adım adım çözüm
- 1
Durumu ve çıkış kodunu kontrol edin
Tüm konteynerleri, kapanmış olanlar dahil görmek için
docker ps -açalıştırın. STATUS sütununa ve çıkış koduna dikkat edin. 0 kodu sürecin normal sonlandığını, 1 genel bir hatayı, 127 var olmayan bir komutu, 137 ise genellikle bellek nedeniyle zorla durdurulduğunu gösterir. - 2
Günlükleri inceleyin
docker logs <ad_veya_id>çalıştırın. Konteyner kapalıysa son yüz satırı görmek için--tail 100ekleyin. Günlükler genellikle tam nedeni içerir, örneğin yapılandırma hatası veya komutun bulunamadığı mesajı. - 3
Konteyneri etkileşimli olarak başlatın
Başlatma komutunu atlayıp kabuğa girin:
docker run -it --entrypoint /bin/sh <imaj>. İmajdashyoksabashdeneyin. Konteyner içinde uygulamayı elle çalıştırın ve normalde görmediğiniz hatayı görün. - 4
Komutu ve entrypoint'i kontrol edin
Dockerfile'a ve
docker runkomutuna bakın.CMDveyaENTRYPOINT'in doğru biçimde olduğundan ve yürütülebilir dosyanın yolunun var olduğundan emin olun.docker composekullanıyorsanızdocker-compose.ymliçindekicommandalanını kontrol edin. - 5
Ana sürecin ön planda kaldığından emin olun
Uygulama arka planda başlatılmamalı veya hemen sonlanmamalıdır. Bir betikse sonuna bir döngü ekleyin veya dinleyen bir sunucu başlatın. Yalnızca etkin kalması gereken konteynerler için geçici çözüm olarak
tail -f /dev/nullkullanın. - 6
Ortam değişkenlerini ve yapılandırmayı kontrol edin
docker inspect <konteyner>çıktısını uygulamanın beklediğiyle karşılaştırın. Eksik değişkenleri-eile veyaenvironmentbölümünde ekleyin. Yapılandırma dosyalarının doğru yola bağlandığından da emin olun. - 7
İzinleri ve sahipliği kontrol edin
Uygulama bir birime veya klasöre yazıyorsa konteyner içindeki kullanıcının izni olduğundan emin olun.
docker runkomutuna--userekleyin veya Dockerfile'ı uyarlayın. İzin hataları günlüklerde genelliklePermission deniedolarak görülür. - 8
Healthcheck ve bağımlılıkları devre dışı bırakın
Compose kullanıyorsanız konteynerin tek başına çalışıp çalışmadığını görmek için
healthcheckvedepends_onsatırlarını geçici olarak yorum satırı yapın. Ardından bunları tek tek geri açın ve davranışı izleyin. - 9
İmajı yeniden oluşturun
Dockerfile'ı değiştirdiyseniz
docker build --no-cache -t <ad> .çalıştırın ve konteyneri yeniden başlatın. Önbelleğe alınmış bir katman, sorunun nedeni olan değişikliği gizleyebilir.
Hiçbir şey yardımcı olmazsa
Uygulamanın daha ayrıntılı günlük kaydını açın ve çıktıyı canlı görmek için -d olmadan docker run ile başlatın. Konteynerin docker inspect içindeki State.OOMKilled alanı nedeniyle kapanıp kapanmadığını kontrol edin. Kubernetes veya başka bir orkestratör kullanıyorsanız olaylara ve yeniden başlatma sayısına bakın. Sorun uygulamanın kendisindeyse Docker'ı izole etmek için aynı ortam değişkenleriyle konteyner dışında çalıştırın. Birden çok servis içeren karmaşık durumlar için yalnızca bir servis içeren minimal bir docker-compose.yml oluşturup diğerlerini kademeli olarak eklemek yararlı olur.
Tekrarlanmaması için
- Herhangi bir şeyi değiştirmeden önce her zaman `docker logs` ve çıkış kodunu kullanın.
- Dockerfile'da `CMD` veya `ENTRYPOINT`'i açıkça belirtin ve yerel olarak test edin.
- Durdurulmuş konteynerleri, kullanılmayan ağları ve başıboş imajları zaman zaman `docker system prune` komutuyla temizleyin; başlatmadan önce nelerin kaldırılacağını kontrol edin ve önemli verilerin yedeğini alın.
- Sürekli çalışması gereken servisler için Compose dosyasında healthcheck ve `restart: unless-stopped` tanımlayın.
Ne zaman uzmana başvurmalı
Tüm adımları denediyseniz ve konteyner hala net bir neden olmadan çıkıyorsa veya sorun birden çok servisi ve üretim ortamını kapsıyorsa, yapılandırmayı ve günlükleri birlikte analiz etmek için IT desteğine başvurun.
Yazılım ve ürün geliştirme · Özel uygulamalar, SaaS ve 4-8 haftada MVPSık sorulan sorular
Konteyner neden 0 çıkış koduyla kapanıyor?
0 çıkış kodu ana sürecin başarıyla sonlandığını gösterir, ancak bu konteynerin artık yapacak bir işi olmadığı anlamına da gelir. Çoğunlukla uygulama arka planda başlatılmıştır veya hemen sonlanmıştır. Çözüm, ana sürecin ön planda kalmasını sağlamaktır.
Günlüklerde görünmeyen hatayı nasıl görebilirim?
Konteyneri `docker run -it --entrypoint /bin/sh <imaj>` ile etkileşimli olarak başlatın ve uygulamayı elle çalıştırın. Böylece çıktıyı canlı görürsünüz. Ayrıca konteyneri geçici olarak `sleep 3600` komutuyla (gerekirse `--entrypoint` ile) başlatıp içine girerek test edebilirsiniz.
137 çıkış kodu ne anlama gelir?
137 kodu genellikle sürecin zorla kesildiğini, çoğunlukla bellek yetersizliği (OOM) nedeniyle olduğunu gösterir. `docker inspect` ve `State.OOMKilled` alanını kontrol edin. Belleği artırın veya uygulamayı optimize edin.