الاختيار هو حاوية / خدمة تشغيل مع عامل الميناء-يؤلف

أنا باستخدام docker-compose.

بعض الأوامر مثل up -d service_name أو start service_name يعودون على الفور وهذا مفيد جدا إذا كنت لا تريد أن تعتمد الحاويات التي تعمل على حالة القشرة ، كما تفعل مع العادية up service_name. حالة الاستخدام الواحدة تقوم بتشغيلها من نوع من خادم التكامل/التسليم المستمر.

ولكن هذه الطريقة في تشغيل / بدء الخدمات لا توفر أي ملاحظات حول الحالة الفعلية للخدمة بعد ذلك.

ال عامل الميناء يؤلف مرجع كلي ل up القيادة هل يذكر الخيار ذي الصلة ، ولكن ، بالنسبة للإصدار 1.7.1، فإنه يستبعد بعضها بعضا مع -d:

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

هل يمكنني بطريقة ما التحقق يدويا من أن الحاوية تعمل بالفعل ولم تتوقف بسبب بعض الأخطاء?

  • docker-compose ps -q <service_name> سيتم عرض معرف الحاوية بغض النظر عن تشغيله أم لا ، طالما تم إنشاؤه.
  • docker ps يظهر فقط تلك التي تعمل بالفعل.

دعونا الجمع بين هذين الأمرين:

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 ps يظهر نسخة قصيرة من معرفات افتراضيا ، لذلك نحن بحاجة إلى تحديد --no-trunc علم.

تحديث: وألقى" البقرى استخدام " تحذير إذا كانت الخدمة لا تعمل. بفضل @دزونيت ، وهنا الجواب المحدثة.

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

أما بالنسبة للإصدار 1.7.1، لا توجد مثل هذه الأوامر المضمنة.

بدلا من ذلك ، فإن exec يمكن استخدامها بطريقة مماثلة.

عند تشغيله للخدمة التي لديها بعض الحاويات حتى سيتم تشغيل موافق:

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

ولكن عند تشغيله للخدمة التي لا يوجد لديه تشغيل الخدمة الحاويات ، وسوف تظهر خطأ:

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

لذلك ، يمكن استخدامه من أجل التحقق ، هل هناك أي حاويات "حية" لخدمة معينة.

لنرى الكل تشغيل الخدمات:

docker-compose ps --services --filter "status=running"

لمعرفة ما إذا كان خدمتك قيد التشغيل:

docker-compose ps --services --filter "status=running" | grep <your-service>

لاحظ أن --filter يجب أن تستخدم مع --services لسبب أجنبي.

يمكنك تشغيل:

docker-compose ps -q service-name

وسوف تحصل على معرف الحاوية إذا service-name يعمل. شيء من هذا القبيل:

18a04e61240d8ffaf4dc3f021effe9e951572ef0cb31da7ce6118f681f585c7f

إذا كانت الخدمة لا تعمل الإخراج فارغ ، لذلك إذا كنت ترغب في استخدام هذا في برنامج نصي يمكنك أن تفعل شيئا مثل:

IS_RUNNING=`docker-compose ps -q service-name`if [[ "$IS_RUNNING" != "" ]]; then    echo "The service is running!!!"fi

كان لدي حاجة مماثلة. ومع ذلك ، لدي restart: always في بيئتي. لذلك قد يكون من الصعب بعض الشيء اكتشاف ما إذا كان هناك شيء ما يتعطل ويعاد تشغيله في حلقة.

أنا جعلت إيسينغا / ناجيوس الاختيار لمقارنة أيضا خلق وبدء مرات. ربما يكون من المفيد لشخص آخر أسفل الخط:

#!/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)

هنا هو واحد بسيط الخطوط الملاحية المنتظمة التي ترجع الوضع الحالي للخدمة:

docker inspect --format "{{.State.Status}}" $(docker-compose ps -q your_service_name)

هذا يعيد فقط حالة حاوية عامل الميناء. إذا كنت ترغب في التحقق من الحالة الفعلية للتطبيق الخاص بك يجب عليك إضافة هيلثشيك إلى دوكيرفيل الخاص بك (https://docs.docker.com/engine/reference/builder/#healthcheck). بعد ذلك يمكنك تفتيشها مع:

docker inspect --format "{{.State.Health.Status}}" $(docker-compose ps -q your_service_name)

ماذا عن هذا?

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

تقوم بإدراج العمليات ، وحدد الأسطر التي يوجد فيها "لأعلى" في العمود 4 وقم بالتصفية لمباراة على اسم الخدمة.

إذا افترضت هذا السيناريو:

  • تبدأ الحاويات وتعمل إلى أجل غير مسمى أو تتوقف على الفور برمز خطأ (أي للتكوين المفقود)
  • يمكنك إجراء الفحص مرة واحدة فقط بعد إرجاع عامل الإرساء

يمكنك التحقق مما إذا كان هناك أي حاوية متوقفة بسبب خطأ في:docker ps -a | grep 'Exited (255)'.

هذا الاختيار يعمل بشكل صحيح حتى في حالة الحاويات التي من المتوقع أن تتوقف على الفور مع أي خطأ (أي حاويات البيانات) ، وحالتها (من docker ps -a) تم وضع علامة على النحو التالي Exited (0).

على سبيل المثال ، في عامل الميناء لدينا-يؤلف.يمل ، نبدأ حاوياتنا مع:

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

ل فب-التيار الوطني الحر ، ونحن نستخدم أمر مماثل:

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

ال dotenv_check.js و dotenv_check.php هي البرامج النصية التي تخرج مع رمز الخطأ في حالة وجود متغير إنف المطلوبة مفقودة.

ال set -e الأمر ، يخبر البرنامج النصي بالتوقف عن الخطأ ، والذي بدوره سيوقف الحاوية على الفور. حول مجموعة الإلكترونية

يمكنك البقرى ل (healthy) أو / و (unhealthy) الصور للعمل بشكل صحيح.

في هذا المثال ، أنا التحقيق عامل الميناء يؤلف كل 5 ثوان لتشغيل الخدمة مع (healthy) الحالة.إذا النصي سوف تجد هذه الخدمة ، فإنه سيتم كسر التنفيذ.إذا السيناريو سوف تتجاوز 300 ثانية ، فإنه سيتم الخروج مع رمز الخطأ.

#!/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

وهنا مبسطة بطانة واحدة على أساس الجواب ألمكيستا ل:

docker ps -q --no-trunc | grep -q "^$(docker-compose ps -q app-service)$"

نحن نستخدم البقرى -q علم لذلك يشير رمز الخروج غير الصفري إلى عدم تشغيل الخدمة. على سبيل المثال:

if docker ps -q --no-trunc | grep -q "^$(dc-audo-dev ps -q app-service)$"; then    echo "Container is still running..."fi