Docker çalışmasının programlı olarak başarılı olup olmadığı nasıl tespit edilir?


83

Konteynırımın hala doğru bir şekilde oluşturulduğunu ve başladığını ve içindeki uygulamanın isteklere yanıt verdiğini hızlı bir şekilde kontrol etmek için çok basit bir bash betiği yazıyorum.

Bazen docker run, örneğin konteyneri bağlamaya çalıştığım bağlantı noktası zaten tahsis edilmiş olduğu için başarısız oluyor. Ancak bu olduğunda docker runçıkış kodu hala 0 olduğundan çıkış kodunu kullanamıyorum. Konteynerin doğru şekilde başlatılıp başlatılmadığını programlı olarak nasıl kontrol edebilirim?

Düşündüğüm çözümler:

  • çıktıyı hatalar için ayrıştır
  • docker ps konteynerin çalışıp çalışmadığını görmek için

ama bu ikisi de biraz fazla ve çirkin görünüyor. docker runBaşarılı olup olmadığını kontrol etmenin daha iyi bir yolunu mu kaçırıyorum ?


1
Buradaki sorunun ne olduğundan emin değilim. Söz konusu işlem her zamanki gibi davranıyorsa, çıkış kodunu kontrol edebilirsiniz. Başarısız durumlar için bile 0 çıkış kodu veriyorsa, bunun bir hata olup olmadığını anlamaya çalışın. Program hangi durumda olursa olsun 0 çıkış kodunu döndürürse, muhtemelen çıktıyı ayrıştırmaktan başka seçeneğiniz kalmaz.
devnull

@Devnull dediği gibi, bunu güvenemezsek docker runbaşka bir emir daha sonra işaret olarak tüm yapabileceğiniz çıktı ayrıştırma (karmaşık veya kırılgan olabilir ki) 'dir başarısızlık üzerine sıfırdan farklı dönüş kodu döndürür veya kullanım (yani sizin psöneri ) ilk komutun sonucunu kontrol etmek için. Dönüş kodunu runda düzeltip düzeltemeyeceklerini görmek için docker ile bir çağrı açmayı düşünebilirsiniz .
Etan Reisner

En son sürüme sahip olduğunuzdan emin olun.
ooga

Konteynırınızda çalıştırılan özel kod mu? eğer öyleyse, Dockerfile'ınızdaki bir portu dışa aktarabilirsiniz, programınız kararlı bir çalışma durumundayken o porta bir "OK" mesajı gönderin. Müşteri kodunuz "Tamam" mesajını bekler.
rexposadas

3
Docker'ı nasıl çalıştırdığınıza ve hangi sürümüne bir örnek verebilir misiniz? Hızlı bir test, liman işçisi çıkış kodunun benim için 1 olduğunu gösteriyordocker run -d -p 9010:9010 busybox true ; echo $?
Abel Muiño

Yanıtlar:


118

Abel Muiño'nun yorumlarda önerdiği gibi, bu daha yeni Docker sürümlerinde düzeltilmiş olabilir (şu anda 0.9.1 çalıştırıyorum).

Ancak, benim gibi eski bir sürümle geçici olarak takılıp kalırsanız, kapsayıcının kullanmaya başlayıp başlamadığını kontrol etmek için iyi bir çözüm buldum docker inspect.

docker inspectkonteyner hakkında çok fazla bilgi içeren ve özellikle konteynerin o anda çalışıp çalışmadığı bir JSON nesnesi döndürür. -fBayrak kolayca gerekli bit ayıklamak sağlar:

docker inspect -f {{.State.Running}} $CONTAINER_ID

veya

docker inspect -f "{{.State.Running}}" $CONTAINER_ID

trueveya dönecek false.

Muhtemelen sleep 1kapsayıcıyı başlatmak ve açık olup olmadığını kontrol etmek arasında (veya daha fazlasını) isteyeceğinizi unutmayın . Kurulumunuzda bir sorun varsa, gerçekten çıkmadan önce çok kısa bir süre 'çalışıyor' olarak görünmesi mümkündür.


11
Neden bunun yerine docker inspect -f {{.State.Running}} <container-id>kullanmıyorsunuz jq? Merak ediyorum.
Dharmit

2
Çünkü incelemenin bunu doğrudan yapmanıza izin verdiğini fark etmemiştim! Teşekkürler @DharmitShah bu harika bir öneri, cevabımı güncelleyeceğim.
Jules Olléon

2
Böyle bir konteyner yoksa hata mesajını bastırmak için stderr'i ile yeniden yönlendirin 2> /dev/null.
thSoft

Bunu bir var'a atıyorsam, 2> /dev/nullhiçbir şeye değer vermediği için kullanırken bir hata alıyorum . falseKapsayıcı yoksa nasıl varsayılan yapabilirim ?
Jake Sankey

1
Ancak bu, yeniden başlatma politikası nedeniyle sürekli olarak yeniden başlatılan kapsayıcıları barındırmaz ... Örneğin, bir kapsayıcıya durdurulmadıkça / her zaman yeniden başlatma ilkesi verilirse .State.Running her zaman true döndürür .... yorulmak!
geekscrap

22

Herhangi bir şeyi ayrıştırmaktan kaçınmak için , konteyner çalışmıyorsa 1 döndüren docker top kullanabilirsiniz :

id=$(docker run mycontainer)
if ! docker top $id &>/dev/null
then
    echo "Container crashed unexpectedly..."
    return 1
fi

10

Kullanabiliriz docker exec $id true 2>/dev/null || echo not running.

Bu komut, "docker top" ın yaptığı gibi stdout'a yazmaz. Konteyner çalışmadığında stderr'e yazar, "docker top" ile aynı mesaj.


2

Yukarıda bahsedilen önerileri bir komut dosyasına uygulamak.

1 - keepMyDockerUp.sh komut dosyası oluşturun :

vi keepMyDockerUp.sh


#!/bin/bash
Container_ID=INSERT_YOUR_CONTAINER_ID HERE
result=$( docker inspect -f {{.State.Running}} $Container_ID)
echo "result is" $result
if [ $result = "true" ]
then
echo "docker is already running"
else
systemctl restart docker
docker start $Container_ID
fi

2 - Ardından cron'a ekleyin, böylece komut dosyanız Docker konteynerinizin zaman zaman çalışıp çalışmadığını doğrular:

crontab -e

Son satıra gidin ve komut dosyanızı ekleyin. Örneğin:

* * * * * /root/keepMyDockerUp.sh

3 - Crontab'i kaydedin ve Docker konteynerinizin bir daha kapanması konusunda asla endişelenmeyin.

Umarım yardımcı olur...

;-)


1

Kullanmalıydım:

$ docker inspect -f {{.State.Health.Status}} xxx

(konteyner çalışır durumdaydı, ancak konteynerin içindeki servis tam olarak başlatılmadı.

İnceleme çıktısının bir parçası:

"State": {
    "Status": "running",
    "Running": true,
    "Paused": false,
    "Restarting": false,
    "OOMKilled": false,
    "Dead": false,
    "Pid": 1618,
    "ExitCode": 0,
    "Error": "",
    "StartedAt": "2019-03-08T10:39:24.061732398Z",
    "FinishedAt": "0001-01-01T00:00:00Z",
    "Health": {
        "Status": "starting",
        "FailingStreak": 0,
        "Log": []

Bu, çalıştırmanın başarılı olup olmadığını belirtmez. Çünkü bir konteyner çalışabilir ve sonra başarısız olabilir.
Vino
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.