Cek adalah wadah / layanan berjalan dengan menulis buruh pelabuhan

22

Saya menggunakan docker-compose.

Beberapa perintah suka up -d service_nameatau start service_nameakan segera kembali dan ini sangat berguna jika Anda tidak ingin wadah berjalan tergantung pada keadaan shell, seperti yang mereka lakukan dengan reguler up service_name. Satu use case menjalankannya dari semacam server integrasi / pengiriman berkelanjutan.

Tetapi cara menjalankan / memulai layanan ini tidak memberikan umpan balik tentang keadaan sebenarnya dari layanan setelahnya.

The Docker Compose CLI referensi untuk upperintah tidak menyebutkan opsi yang relevan, tapi, seperti untuk versi 1.7.1, itu adalah saling eksklusif dengan -d:

--abort-on-container-exit  Stops all containers if any container was stopped.
                           *Incompatible with -d.*

Dapatkah saya entah bagaimana secara manual memeriksa bahwa wadah memang berfungsi dan belum berhenti karena beberapa kesalahan?

Ivan Kolmychek
sumber

Jawaban:

15
  • docker-compose ps -q <service_name> akan menampilkan ID kontainer tidak peduli itu berjalan atau tidak, selama itu dibuat.
  • docker ps hanya menunjukkan yang benar-benar berjalan.

Mari kita gabungkan dua perintah ini:

if [ -z `docker ps -q --no-trunc | grep $(docker-compose ps -q <service_name>)` ]; then
  echo "No, it's not running."
else
  echo "Yes, it's running."
fi

docker psmenunjukkan versi pendek ID secara default, jadi kita perlu menentukan --no-truncflag.

UPDATE : Ini melemparkan peringatan "grep use" jika layanan tidak berjalan. Terima kasih kepada @Dzhuneyt, inilah jawaban yang diperbarui.

if [ -z `docker-compose ps -q <service_name>` ] || [ -z `docker ps -q --no-trunc | grep $(docker-compose ps -q <service_name>)` ]; then
  echo "No, it's not running."
else
  echo "Yes, it's running."
fi
elquimista
sumber
Bagus, dan itu juga mengatasi masalah dengan jawaban saat ini yang dinyatakan dalam komentar. Menandai ini sebagai jawaban baru.
Ivan Kolmychek
1
Jika Anda menggunakan kebijakan mulai ulang, Anda juga perlu memfilternya untuk hanya menyertakan wadah yang sedang berjalan (bukan yang sedang dalam kondisi mulai ulang):docker ps -q -f "status=running" --no-trunc | grep $(docker-compose ps -q <service_name>)
Maks.
1
Ini berfungsi tetapi melontarkan peringatan "penggunaan grep" jika layanan tidak berjalan, dengan kata lain, ketika grep ....bagian tersebut berakhir dengan string kosong.
Dzhuneyt
@ Dzhuneyt saya tahu, ya, Anda benar. Pikiran untuk menghindari / menangani peringatan grep itu?
elquimista
1
@elquimista Ya, saya dipecahkan dengan menggunakan operator OR: if [ -z `docker-compose ps -q mysql` ] || [ -z `docker ps -q --no-trunc | grep $(docker-compose ps -q mysql)` ]; then. Apa yang dilakukan adalah: pertama memeriksa apakah layanan ada sama sekali (bahkan jika itu dihentikan) dan bagian kedua memeriksa apakah layanan yang ada benar-benar berjalan. Anda mungkin ingin memasukkan ini dalam contoh Anda untuk pembaca masa depan yang melirik hanya pada jawaban yang diterima. Saya pikir ini berguna.
Dzhuneyt
12

Sedangkan untuk versi 1.7.1, tidak ada perintah bawaan seperti itu.

Sebagai gantinya, execdapat digunakan dengan cara yang sama.

Ketika Anda menjalankannya untuk layanan yang memiliki beberapa kontainer itu akan berjalan ok:

~/apperture-science $ docker-compose exec chell echo 'Still alive!'
Still alive!
~/apperture-science $ echo $?
0

Tetapi ketika Anda menjalankannya untuk layanan yang tidak memiliki wadah layanan yang berjalan , itu akan menampilkan kesalahan:

~/apperture-science $ docker-compose exec glados echo "Still alive!"
ERROR: No container found for apperture-science-glados_1
~/apperture-science $ echo $?
1

Jadi, dapat digunakan untuk memeriksa, apakah ada wadah "hidup" untuk layanan yang diberikan.

Ivan Kolmychek
sumber
5

Anda dapat menjalankan:

docker-compose ps -q service-name

Dan Anda akan mendapatkan id wadah jika service-namesedang berjalan. Sesuatu seperti:

18a04e61240d8ffaf4dc3f021effe9e951572ef0cb31da7ce6118f681f585c7f

Jika layanan tidak menjalankan output kosong, jadi jika Anda ingin menggunakan ini dalam skrip Anda dapat melakukan sesuatu seperti:

IS_RUNNING=`docker-compose ps -q service-name`
if [[ "$IS_RUNNING" != "" ]]; then
    echo "The service is running!!!"
fi
alejandropg
sumber
Ya, itu juga berhasil. Tandai ini sebagai jawaban sekarang.
Ivan Kolmychek
12
Ini tidak memberi tahu Anda apakah wadah sedang berjalan atau tidak, hanya jika ada atau tidak. Coba lakukan docker-compose upCtrl-C. docker-compose psMaka harus menunjukkan bahwa negara kontainer tidak "Atas", tetapi docker-compose ps -q service-namemasih memberi Anda id.
Djanderson
2

Saya memiliki kebutuhan yang sama. Namun, saya punya restart: alwaysdi lingkungan saya. Jadi agak sulit untuk mendeteksi jika ada sesuatu yang macet dan memulai kembali dalam satu lingkaran.

Saya membuat cek Icinga / Nagios untuk membandingkan waktu yang dibuat dan mulai. Mungkin bermanfaat bagi orang lain di telepon:

#!/usr/bin/env python
from __future__ import print_function
import argparse
from datetime import timedelta
from datetime import datetime
import sys

from dateutil.parser import parse as parse_date
import docker
import pytz
parser = argparse.ArgumentParser()
parser.add_argument("compose_project",
                    help="The name of the docker-compose project")
parser.add_argument("compose_service",
                    help="The name of the docker-compose service")
args = vars(parser.parse_args())

client = docker.from_env()
service_containers = client.containers.list(filters={
    "label": [
        "com.docker.compose.oneoff=False",
        "com.docker.compose.project={}".format(args["compose_project"]),
        "com.docker.compose.service={}".format(args["compose_service"])
    ]})

if len(service_containers) == 0:
    print("CRITICAL: project({})/service({}) doesn't exist!".format(
        args["compose_project"], args["compose_service"]))
    sys.exit(2)
elif len(service_containers) > 1:
    print("CRITICAL: project({})/service({}) has more than 1 "
          "container!".format(
              args["compose_project"], args["compose_service"]))
    sys.exit(2)

service_container = service_containers[0]
created_at = parse_date(service_container.attrs['Created'])
status = service_container.attrs['State']['Status']
started_at = parse_date(service_container.attrs['State']['StartedAt'])
now = datetime.utcnow().replace(tzinfo=pytz.utc)
uptime = now - started_at

if status in ['stopped', 'exited', 'dead']:
    print("CRITICAL: project({})/service({}) is status={}".format(
        args["compose_project"], args["compose_service"], status))
    sys.exit(2)

if (started_at - created_at) > timedelta(minutes=5):
    if uptime < timedelta(seconds=5):
        print("CRITICAL: project({})/service({}) appears to be "
              "crash-looping".format(
                  args["compose_project"], args["compose_service"]))
        sys.exit(2)

if status == "restarting":
    print("WARNING: project({})/service({}) is restarting".format(
        args["compose_project"], args["compose_service"]))
    sys.exit(1)

print ("OK: project({})/service({}) is up for {}".format(
    args["compose_project"], args["compose_service"], uptime
))
sys.exit(0)
jof
sumber
0

Jika Anda menganggap skenario ini:

  • kontainer mulai dan berjalan tanpa batas waktu atau segera berhenti dengan kode kesalahan (mis. untuk konfigurasi yang hilang)
  • Anda melakukan pemeriksaan hanya sekali setelah buruh pelabuhan-menyusun kembali-d

Anda dapat memeriksa apakah ada wadah berhenti karena kesalahan dengan: docker ps -a | grep 'Exited (255)'.

Pemeriksaan ini berfungsi dengan benar bahkan dalam kasus kontainer yang diharapkan untuk segera berhenti tanpa kesalahan (yaitu wadah data), karena statusnya (dari docker ps -a) ditandai sebagai Exited (0).

Misalnya, di docker-compose.yml kami, kami memulai wadah kami dengan:

command: sh -c 'node dotenv_check.js && pm2 start --no-daemon src/worker.js --watch'

Untuk php-fpm, kami menggunakan perintah serupa:

command: >-
  sh -c '
  set -e;
  for PROJECT in frontend backend; do
    cd /var/www/$${PROJECT};
    php dotenv_check.php;
  done;
  php-fpm
  '

The dotenv_check.jsdan dotenv_check.phpskrip yang keluar dengan kode kesalahan dalam kasus variabel env diperlukan hilang.

The set -eperintah, memberitahu script untuk berhenti pada kesalahan, yang, pada gilirannya, akan segera menghentikan wadah. Tentang set-e

Fabio
sumber
0

Bagaimana dengan ini?

docker-compose ps | awk '$4 == "Up" {print $1}' | grep <service-name>

Anda mendaftar proses, pilih garis di mana "Atas" di kolom 4 dan saring untuk kecocokan pada nama layanan.

George Mauer
sumber