Beberapa perintah seperti up -d service_name atau start service_name kembali segera dan ini cukup berguna jika Anda tidak ingin wadah berjalan bergantung pada keadaan shell, seperti yang mereka lakukan dengan biasa up service_name. Satu kasus penggunaan menjalankannya dari beberapa jenis server integrasi/pengiriman berkelanjutan.
Tetapi cara menjalankan/memulai layanan ini tidak memberikan umpan balik apa pun tentang keadaan layanan yang sebenarnya setelahnya.
Saya memiliki kebutuhan yang sama. Namun, saya memiliki restart: always di lingkungan saya. Jadi mungkin agak sulit untuk mendeteksi jika ada sesuatu yang mogok dan memulai ulang dalam satu lingkaran.
Saya membuat pemeriksaan Icinga / Nagios untuk juga membandingkan waktu yang dibuat dan mulai. Mungkin itu berguna untuk orang lain di telepon:
#!/usr/bin/env pythonfrom __future__ import print_functionimport argparsefrom datetime import timedeltafrom datetime import datetimeimport sysfrom dateutil.parser import parse as parse_dateimport dockerimport pytzparser = 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_atif 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)
Ini hanya mengembalikan status wadah buruh pelabuhan. Jika Anda ingin memeriksa keadaan sebenarnya dari aplikasi Anda, Anda harus menambahkan HEALTHCHECK ke Dockerfile Anda (https://docs.docker.com/engine/reference/builder/#healthcheck). Setelah itu Anda dapat memeriksanya dengan:
kontainer mulai dan berjalan tanpa batas waktu atau segera berhenti dengan kode kesalahan (yaitu untuk konfigurasi yang hilang)
anda melakukan pemeriksaan hanya sekali setelah docker-compose up-d kembali
Anda dapat memeriksa apakah ada wadah yang berhenti karena kesalahan dengan:docker ps -a | grep 'Exited (255)'.
Pemeriksaan ini berfungsi dengan benar bahkan dalam kasus wadah yang diharapkan segera berhenti tanpa kesalahan( yaitu wadah data), sebagai statusnya (dari docker ps -a) ditandai sebagai Exited (0).
Misalnya, dalam docker-compose kami.yml, kita mulai kontainer kami dengan:
Anda dapat grep untuk (healthy) atau / dan (unhealthy) gambar untuk bertindak dengan benar.
Dalam contoh ini, saya menyelidiki docker-compose setiap 5 detik untuk menjalankan layanan dengan (healthy) status.Jika script akan menemukan layanan tersebut, itu akan mematahkan eksekusi.Jika script akan melebihi 300 detik, itu akan keluar dengan kode kesalahan.
#!/bin/bashSECONDS=0LIMIT=300x=$(docker-compose -f /mnt/<service>/docker-compose.yaml ps <service> | grep -c '(healthy)')while [[ $x == "0" ]]; do echo "Please wait until <service> becomes healthy" sleep 5 x=$(docker-compose -f /mnt/<service>/docker-compose.yaml ps <service> | grep -c '(healthy)') EXPIRED=$SECONDS if [[ $x == "1" ]]; then echo "<service> is healthy..." break elif [[ $LIMIT -lt $EXPIRED ]]; then echo "<service> startup has exceeded 5m timeout, exiting!" exit 1 fidone