Ollie
April 30, 2022, 11:46pm
#1
أنا باستخدام 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
لسبب أجنبي.
Skylar
May 1, 2022, 12:06am
#5
يمكنك تشغيل:
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
Harley
May 1, 2022, 12:11am
#6
كان لدي حاجة مماثلة. ومع ذلك ، لدي 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 وقم بالتصفية لمباراة على اسم الخدمة.
Ray
May 1, 2022, 12:26am
#9
إذا افترضت هذا السيناريو:
تبدأ الحاويات وتعمل إلى أجل غير مسمى أو تتوقف على الفور برمز خطأ (أي للتكوين المفقود)
يمكنك إجراء الفحص مرة واحدة فقط بعد إرجاع عامل الإرساء
يمكنك التحقق مما إذا كان هناك أي حاوية متوقفة بسبب خطأ في: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
الأمر ، يخبر البرنامج النصي بالتوقف عن الخطأ ، والذي بدوره سيوقف الحاوية على الفور. حول مجموعة الإلكترونية
Quinn
May 1, 2022, 12:31am
#10
يمكنك البقرى ل (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