चेक कंटेनर / सेवा है जो डॉकटर-कंपोज़ के साथ चल रही है


22

मैं उपयोग कर रहा हूं docker-compose

कुछ कमांड जैसे up -d service_nameया start service_nameतुरंत लौट रहे हैं और यह बहुत उपयोगी है यदि आप नहीं चाहते कि कंटेनर शेल की स्थिति पर निर्भर हो, जैसे वे नियमित रूप से करते हैं up service_name। एक उपयोग-मामला इसे किसी प्रकार के निरंतर एकीकरण / वितरण सर्वर से चला रहा है।

लेकिन सेवाओं को चलाने / शुरू करने का यह तरीका बाद में सेवा की वास्तविक स्थिति के बारे में कोई प्रतिक्रिया नहीं देता है।

के लिए डोकर लिखें CLI संदर्भ upआदेश प्रासंगिक विकल्प का उल्लेख करता है, लेकिन, संस्करण के लिए के रूप में 1.7.1, इसके साथ पारस्परिक रूप से विशिष्ट है -d:

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

क्या मैं किसी तरह मैन्युअल रूप से जांच सकता हूं कि कंटेनर वास्तव में काम कर रहा है और कुछ त्रुटि के कारण बंद नहीं हुआ है?

जवाबों:


15
  • 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ध्वज निर्दिष्ट करने की आवश्यकता है ।

अद्यतन : यदि सेवा नहीं चल रही थी, तो उसने "grep उपयोग" चेतावनी फेंक दी। @Dzhuneyt के लिए धन्यवाद, यहाँ अद्यतन जवाब है।

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

एक अच्छा है, और यह वर्तमान उत्तर के साथ समस्या को भी संबोधित करता है जो टिप्पणियों में कहा गया था। इसे एक नए उत्तर के रूप में चिह्नित करना।
इवान Kolmychek

1
यदि आप एक पुनः आरंभ करने की नीति का उपयोग कर रहे हैं, तो आपको इसे केवल फ़िल्टर करने की आवश्यकता होती है जिसमें केवल चल रहे कंटेनर (बल्कि पुनः आरंभ करने की स्थिति में) शामिल हैं:docker ps -q -f "status=running" --no-trunc | grep $(docker-compose ps -q <service_name>)
अधिकतम

1
यह काम करता है लेकिन यदि सेवा grep ....खाली नहीं है, तो दूसरे शब्दों में, जब एक खाली स्ट्रिंग के साथ भाग समाप्त होता है , तो "grep उपयोग" चेतावनी फेंकता है ।
डिझुनेट

@Dzhuneyt मुझे पता है, हां, आप सही हैं। उस चेतावनी से बचने / संभालने के लिए विचार?
एलक्विमिस्टा

1
@elquimista हाँ, मैंने इसे OR ऑपरेटर का उपयोग करके हल किया है if [ -z `docker-compose ps -q mysql` ] || [ -z `docker ps -q --no-trunc | grep $(docker-compose ps -q mysql)` ]; then:। यह क्या करता है: यह पहले जांचता है कि क्या सेवा सभी में मौजूद है (भले ही यह बंद हो गया है) और दूसरा भाग यह जांचता है कि क्या मौजूदा सेवा वास्तव में चल रही है। आप इसे भविष्य के पाठकों के लिए अपने उदाहरण में शामिल करना चाह सकते हैं जो केवल स्वीकृत उत्तर की ओर देखते हैं। मुझे लगता है कि यह उपयोगी है।
डिझुनेट

12

संस्करण के लिए 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

तो, यह जांच के क्रम में इस्तेमाल किया जा सकता है, क्या दी गई सेवा के लिए कोई "जीवित" कंटेनर है।


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

हां, वह भी काम करता है। इसे अब जवाब के रूप में चिह्नित किया गया है।
इवान कोलेमिचेक

12
यह आपको नहीं बताता है कि कंटेनर चल रहा है या नहीं, बस मौजूद है या नहीं। docker-compose upफिर Ctrl-C करने का प्रयास करें । docker-compose psफिर यह दिखाना चाहिए कि कंटेनर राज्य "अप" नहीं हैं , लेकिन फिर docker-compose ps -q service-nameभी आपको एक आईडी देता है।
djanderson

2

मेरी भी ऐसी ही जरूरत थी। हालाँकि, मेरे पास restart: alwaysमेरे वातावरण में है। तो यह पता लगाने के लिए थोड़ा मुश्किल हो सकता है कि क्या कुछ दुर्घटनाग्रस्त हो रहा है और लूप में फिर से शुरू हो रहा है।

मैंने बनाई और शुरू के समय की तुलना करने के लिए एक Icinga / Nagios चेक भी बनाया। शायद यह रेखा के नीचे किसी और के लिए उपयोगी है:

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

0

यदि आप इस परिदृश्य को मानते हैं:

  • कंटेनर या तो प्रारंभ और अनिश्चित काल तक चलते हैं या एक त्रुटि कोड के साथ तुरंत बंद हो जाते हैं (अर्थात अनुपलब्ध कॉन्फ़िगरेशन के लिए)
  • आप केवल एक बार do-Compose अप -d रिटर्न के बाद ही चेक करते हैं

आप जाँच कर सकते हैं कि क्या कोई बंद कर दिया कंटेनर है के साथ एक त्रुटि के कारण: docker ps -a | grep 'Exited (255)'

यह चेक उन कंटेनरों के मामले में भी सही ढंग से काम करता है, जिनके बिना किसी त्रुटि (यानी डेटा कंटेनर) के साथ तुरंत बंद होने की उम्मीद है, क्योंकि उनकी स्थिति (से docker ps -a) के रूप में चिह्नित है Exited (0)

उदाहरण के लिए, हमारे docker-compose.yml में, हम अपने कंटेनर को इसके साथ शुरू करते हैं:

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

Php-fpm के लिए, हम एक समान कमांड का उपयोग करते हैं:

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लिपियों मामले में एक त्रुटि कोड एक आवश्यक env चर याद आ रही है के साथ जो बाहर निकलें कर रहे हैं।

set -eआदेश, स्क्रिप्ट बताता त्रुटि पर बंद करने के लिए है, जो, बारी-बारी, तुरंत कंटेनर बंद हो जाएगा। सेट-ई के बारे में


0

इस बारे में कैसा है?

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

आप प्रक्रियाओं को सूचीबद्ध करते हैं, उन पंक्तियों का चयन करते हैं जहां कॉलम 4 में "ऊपर" है और सेवा नाम पर एक मैच के लिए फ़िल्टर करें।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.