web-dev-qa-db-ja.com

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

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

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

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

upコマンドのDocker Compose CLIリファレンス は関連するオプションについて言及していますが、バージョン1.7.1については、-dと相互に排他的です。

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

コンテナが実際に機能していて、何らかのエラーが原因で停止していないことを手動で確認できますか?

24
Ivan Kolmychek
  • 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フラグを指定する必要があります。

[〜#〜] update [〜#〜]:サービスが実行されていない場合、「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
18
elquimista

バージョンは1.7.1、そのようなコマンドは組み込まれていません。

代わりに、execを同様の方法で使用できます。

コンテナがいくつかあるサービスに対して実行すると、正常に実行されます。

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

ただし、実行中のserviceコンテナがないサービスに対して実行すると、エラーが表示されます。

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

そのため、特定のサービスに「生きている」コンテナがあるかどうかを確認するために使用できます。

12
Ivan Kolmychek

以下を実行できます。

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
6
alejandropg

同様のニーズがありました。ただし、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)
2
jof

これはどう?

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

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

0
George Mauer

このシナリオを想定した場合:

  • コンテナは、無期限に起動して実行されるか、エラーコード(つまり、構成が見つからない場合)ですぐに停止します。
  • 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は、必要な環境変数が欠落している場合にエラーコードで終了するスクリプトです。

set -eコマンドは、エラー時に停止するようにスクリプトに指示します。エラーが発生すると、コンテナーはすぐに停止します。 set-eについて

0
Fabio