컨테이너 / 서비스가 docker-compose로 실행되고 있는지 확인하십시오.


22

을 사용하고 docker-compose있습니다.

일부 명령 은 바로 돌아가 up -d service_name거나 start service_name돌아가고 있으며 이는 regular 컨테이너와 같이 컨테이너가 실행되는 것을 쉘의 상태에 의존하지 않으려는 경우에 매우 유용합니다 up service_name. 하나의 유스 케이스는 일종의 지속적인 통합 / 배달 서버에서 실행 중입니다.

그러나 서비스를 실행 / 시작하는이 방법은 나중에 서비스의 실제 상태에 대한 피드백을 제공하지 않습니다.

에 대한 도커 작성 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 실제로 실행중인 항목 만 표시합니다.

이 두 명령을 결합 해 봅시다 :

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

좋은 점이며 의견에 명시된 현재 답변의 문제도 해결합니다. 이것을 새로운 답변으로 표시하십시오.
Ivan Kolmychek

1
재시작 정책을 사용하는 경우 재시작 컨테이너 상태가 아닌 실행 컨테이너 만 포함하도록 필터링해야합니다.docker ps -q -f "status=running" --no-trunc | grep $(docker-compose ps -q <service_name>)
Max

1
이것은 작동하지만 서비스가 실행 중이 아닌 경우 즉, grep ....부분이 빈 문자열로 끝나는 경우 "grep usage"경고를 발생시킵니다 .
Dzhuneyt

@Dzhuneyt 알고 있습니다. 네 맞습니다. 그렙 경고를 피 / 처리 할 생각이 있으십니까?
elquimista

1
@elquimista 예, OR 연산자를 사용하여 해결했습니다 if [ -z `docker-compose ps -q mysql` ] || [ -z `docker ps -q --no-trunc | grep $(docker-compose ps -q mysql)` ]; then. 이것이하는 일 : 먼저 서비스가 존재하는지 (중지 된 경우에도) 확인하고 두 번째 부분은 기존 서비스가 실제로 실행 중인지 확인합니다. 허용 된 답변 만 보는 미래의 독자를 위해이 예제를 예제에 포함 할 수 있습니다. 유용하다고 생각합니다.
Dzhuneyt

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

그렇습니다. 이것을 답변으로 표시했습니다.
Ivan Kolmychek

12
컨테이너가 실행 중인지 여부를 알려주지 않습니다. docker-compose up그런 다음 Ctrl-C를 시도하십시오 . docker-compose ps그런 다음 컨테이너 상태가 "업" 되지 않았지만 docker-compose ps -q service-name여전히 ID를 제공 한다는 것을 보여줍니다 .
djanderson

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 return 후에 한 번만 확인하십시오.

다음과 같은 오류로 인해 중지 된 컨테이너가 있는지 확인할 수 있습니다 docker ps -a | grep 'Exited (255)'.

이 검사는 상태 (from 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.jsdotenv_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.