চেক হ'ল ধারক / পরিষেবা যা ডকার-রচনা দিয়ে চলছে


22

আমি ব্যবহার করছি docker-compose

কিছু কমান্ড এখনই ফিরছে up -d service_nameবা start service_nameএখুনি ফিরে আসছে এবং আপনি যদি ধারনা করেন না যে কন্টেনারগুলি শেলের অবস্থার উপর নির্ভর করে, যেমন তারা নিয়মিত করে up service_name। এক-ব্যবহার-কেসটি এটিকে কোনও না কোনও ধরণের সংঘবদ্ধ ইন্টিগ্রেশন / ডেলিভারি সার্ভার থেকে চালাচ্ছে।

তবে পরিষেবাগুলি চালনা / শুরু করার এই পদ্ধতিটি পরে পরিষেবাটির প্রকৃত অবস্থা সম্পর্কে কোনও প্রতিক্রিয়া সরবরাহ করে না।

জন্য Docker কম্পোজ 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পতাকা নির্দিষ্ট করতে হবে ।

আপডেট : পরিষেবাটি চালু না থাকলে এটি "গ্রেপ ব্যবহার" সতর্কতা ছুড়ে দিয়েছে। @ ডিজনিয়েটকে ধন্যবাদ, আপডেট হওয়া উত্তর এখানে's

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
আপনি যদি পুনঃসূচনা নীতিটি ব্যবহার করেন তবে আপনাকে কেবল চলমান পাত্রে অন্তর্ভুক্ত করতে পুনরায় ফিল্টার করতে হবে (পুনরায় আরম্ভের অবস্থার চেয়ে বরং):docker ps -q -f "status=running" --no-trunc | grep $(docker-compose ps -q <service_name>)
সর্বোচ্চ

1
এটি কাজ করে তবে পরিষেবাটি চলমান না থাকলে "গ্রেপ ব্যবহার" সতর্কতা ছুড়ে দেয়, অন্য কথায়, যখন grep ....খালি স্ট্রিংয়ের সাথে অংশটি শেষ হয়।
ডিজনিয়েট

@ ডিজনেয়েট আমি জানি, হ্যাঁ, আপনি ঠিক বলেছেন। সেই গ্রেপ সতর্কতাটি এড়াতে / পরিচালনা করার চিন্তাভাবনা?
এলকুইমিস্ট

1
@ এলকুইমিস্টা হ্যাঁ, আমি ওআর অপারেটরটি ব্যবহার করে এটি সমাধান করেছি 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আমার পরিবেশে একটি আছে । সুতরাং কোনও লুপে ক্র্যাশ হয়ে পুনরায় চালু হচ্ছে কিনা তা সনাক্ত করা কিছুটা জটিল be

আমি তৈরি করা এবং শুরু হওয়া সময়ের সাথে তুলনা করার জন্য একটি আইসিংগা / নাগিওস চেক করেছি। এই লাইনে অন্য কারও জন্য এটি দরকারী:

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

আপনি যদি এই দৃশ্যটি ধরে নেন:

  • পাত্রে হয় হয় শুরু হয় এবং অনির্দিষ্টকালের জন্য চালানো হয় বা ত্রুটি কোড সহ তাত্ক্ষণিকভাবে থামানো হয় (যেমন অনুপস্থিত কনফিগারেশন জন্য)
  • আপনি ডকার-রচনা আপ-ডি রিটার্নের পরে একবারই চেকটি করেন

আপনি না পরীক্ষা করতে যদি কোনো বন্ধ ধারক সঙ্গে একটি ত্রুটির কারণে: 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স্ক্রিপ্ট ক্ষেত্রে একটি ত্রুটি কোডের একটি প্রয়োজনীয় env পরিবর্তনশীল অনুপস্থিত সঙ্গে যা প্রস্থান হয়।

set -eকমান্ড স্ক্রিপ্ট বলে ত্রুটি বন্ধ করতে, যা, পালাক্রমে, অবিলম্বে ধারক বন্ধ করে দেব। সেট-ই সম্পর্কে


0

এ কেমন?

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

আপনি প্রক্রিয়াগুলি তালিকাবদ্ধ করুন, 4 টি কলামে "আপ" রয়েছে এমন লাইনগুলি নির্বাচন করুন এবং পরিষেবার নামের সাথে কোনও মিলের জন্য ফিল্টার করুন।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.