docker-compose
を使用しています。
up -d service_name
やstart 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.*
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
バージョンは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
そのため、特定のサービスに「生きている」コンテナがあるかどうかを確認するために使用できます。
以下を実行できます。
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
同様のニーズがありました。ただし、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)
これはどう?
docker-compose ps | awk '$4 == "Up" {print $1}' | grep <service-name>
プロセスをリストし、「Up」が列4にある行を選択し、サービス名の一致をフィルタリングします。
このシナリオを想定した場合:
次のエラーでコンテナが停止していないかどうかを確認できます: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について