チェックはdocker-composeで実行されているコンテナ/サービスです


22

を使用していdocker-composeます。

up -d service_nameまたはのようないくつかのコマンドstart service_nameはすぐに戻ります。これは、通常のようにコンテナの実行をシェルの状態に依存させたくない場合に非常に便利ですup service_name。1つのユースケースは、ある種の継続的な統合/配信サーバーから実行することです。

ただし、この方法でサービスを実行/開始しても、その後のサービスの実際の状態に関するフィードバックは提供されません。

コマンドDocker Compose 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> コンテナIDは、作成されている限り、実行中かどうかに関係なく表示されます。
  • docker ps 実際に実行されているもののみを表示します。

これらの2つのコマンドを組み合わせてみましょう。

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デフォルトではIDの短いバージョンが表示されるため、--no-truncフラグを指定する必要があります。

更新:サービスが実行されていない場合、「grep usage」警告がスローされました。@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

いいですね。また、コメントに記載されている現在の回答の問題にも対処しています。これを新しい回答としてマークします。
イヴァンコルミチェック

1
:あなたが再起動ポリシーを使用している場合にも実行されているコンテナ(というよりも、再起動状態のもの)のみ含まれるように、それをフィルタリングする必要があるdocker ps -q -f "status=running" --no-trunc | grep $(docker-compose ps -q <service_name>)
マックス

1
これは機能しますが、サービスが実行されていない場合、つまり、grep ....パーツが空の文字列で終わる場合、「grep usage」警告をスローします。
ジュネート

@Dzhuneyt私は知っています、はい、あなたは正しいです。そのgrep警告を回避/処理することを考えていますか?
elquimista

1
@elquimistaはい、OR演算子を使用して解決しましたif [ -z `docker-compose ps -q mysql` ] || [ -z `docker ps -q --no-trunc | grep $(docker-compose ps -q mysql)` ]; then。これは、最初にサービスが存在するかどうか(停止している場合でも)を確認し、2番目の部分は既存のサービスが実際に実行されているかどうかを確認します。受け入れられた答えのみを見る将来の読者のために、これを例に含めたいかもしれません。便利だと思います。
ジュネイ

12

version 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実行中の場合、コンテナのIDを取得します。何かのようなもの:

18a04e61240d8ffaf4dc3f021effe9e951572ef0cb31da7ce6118f681f585c7f

サービスが実行されていない場合、出力は空になります。したがって、スクリプトでこれを使用する場合は、次のようなことができます。

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

はい、それも機能します。これを今すぐ回答としてマークしました。
イヴァンコルミチェック

12
コンテナが存在するかどうかだけで、コンテナが実行されているかどうかはわかりません。docker-compose upCtrl-Cを実行してみてください。docker-compose psコンテナの状態が「Up」ではないことを示す必要docker-compose ps -q service-nameがありますが、それでもIDを提供します。
ジャンダーソン

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

このシナリオを想定する場合:

  • コンテナは、無期限に起動して実行するか、エラーコードで即座に停止します(つまり、構成が欠落している場合)
  • docker-compose up -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コマンドは、エラー時に停止するようにスクリプトに指示します。これにより、コンテナーはすぐに停止します。set-eについて


0

これはどう?

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

プロセスをリストし、列4に「Up」がある行を選択し、サービス名に一致するようにフィルター処理します。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.