Вопрос: Проверьте, работает ли контейнер / сервис с док-станцией


Я использую docker-compose,

Некоторые команды вроде up -d service_name или start service_name возвращаются сразу, и это очень полезно, если вы не хотите, чтобы контейнеры работали в зависимости от состояния оболочки, как это происходит с обычными up service_name, Один прецедент использует его с какого-то непрерывного сервера интеграции / доставки.

Но этот способ запуска / запуска услуг не дает никакой обратной связи о фактическом состоянии службы после этого.

Docker Compose CLI для up команда упоминает соответствующий вариант, но, что касается версии 1.7.1, он является взаимоисключающим с -d:

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

Могу ли я как-то вручную проверить, что контейнер действительно работает и не остановился из-за некоторой ошибки?


7
2017-07-13 15:04


Источник




Ответы:


Вы можете запустить:

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

3
2018-02-02 20:06



Да, это тоже работает. Отмечено это как ответ. - Ivan Kolmychek
Это не говорит вам, работает ли контейнер или нет, только если он существует или нет. Попробуйте сделать docker-compose up затем Ctrl-C. docker-compose ps должен показать, что состояния контейнера не «Вверх», но docker-compose ps -q service-name по-прежнему дает вам идентификатор. - djanderson


Что касается версии 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

Таким образом, его можно использовать для проверки, существуют ли какие-либо «живые» контейнеры для данного сервиса.


7
2017-07-13 15:04





У меня была такая же потребность. Однако у меня есть 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)

1
2018-04-20 15:07





Если вы примете этот сценарий:

  • контейнеры запускаются или запускаются неограниченно или немедленно останавливаются с кодом ошибки (т. е. для отсутствия конфигурации)
  • вы делаете проверку только один раз после того, как 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 , говорит сценарию останавливаться на ошибке, которая, в свою очередь, немедленно остановит контейнер. О наборе


0
2017-08-02 12:51