Kiểm tra là container / dịch vụ đang chạy với docker-compose


22

Tôi đang sử dụng docker-compose.

Một số lệnh như up -d service_namehoặc start service_nameđang quay trở lại ngay lập tức và điều này khá hữu ích nếu bạn không muốn các container chạy phụ thuộc vào trạng thái của vỏ, giống như chúng thường làm up service_name. Một trường hợp sử dụng đang chạy nó từ một loại máy chủ phân phối / tích hợp liên tục.

Nhưng cách chạy / bắt đầu dịch vụ này không cung cấp bất kỳ phản hồi nào về tình trạng thực tế của dịch vụ sau đó.

Các tài liệu tham khảo Docker Soạn CLI cho uplệnh không đề cập đến các tùy chọn liên quan, nhưng, như đối với phiên bản 1.7.1, nó là loại trừ lẫn nhau với -d:

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

Tôi có thể bằng cách nào đó kiểm tra thủ công rằng container thực sự đang hoạt động và chưa dừng lại do một số lỗi không?

Câu trả lời:


15
  • docker-compose ps -q <service_name> sẽ hiển thị ID container bất kể nó có chạy hay không, miễn là nó được tạo.
  • docker ps chỉ hiển thị những người đang thực sự chạy.

Hãy kết hợp hai lệnh này:

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 pshiển thị phiên bản ngắn của ID theo mặc định, vì vậy chúng tôi cần chỉ định --no-trunccờ.

CẬP NHẬT : Nó đã ném cảnh báo "sử dụng grep" nếu dịch vụ không chạy. Cảm ơn @Dzhuneyt, đây là câu trả lời được cập nhật.

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

Một trong những tốt đẹp, và nó cũng giải quyết vấn đề với câu trả lời hiện tại đã được nêu trong các ý kiến. Đánh dấu đây là một câu trả lời mới.
Ivan Kolmychek

1
Nếu bạn đang sử dụng chính sách khởi động lại, bạn cũng cần lọc nó để chỉ bao gồm các container đang chạy (chứ không phải các container đang ở trạng thái khởi động lại):docker ps -q -f "status=running" --no-trunc | grep $(docker-compose ps -q <service_name>)
Tối đa

1
Điều này hoạt động nhưng đưa ra cảnh báo "sử dụng grep" nếu dịch vụ không chạy, nói cách khác, khi grep ....phần kết thúc bằng một chuỗi trống.
Dzhuneyt

@Dzhuneyt Tôi biết, vâng, bạn nói đúng. Suy nghĩ để tránh / xử lý cảnh báo grep đó?
elquimista

1
@elquimista Có, tôi đã giải quyết nó bằng toán tử OR : if [ -z `docker-compose ps -q mysql` ] || [ -z `docker ps -q --no-trunc | grep $(docker-compose ps -q mysql)` ]; then. Điều này thực hiện là: đầu tiên nó kiểm tra xem dịch vụ có tồn tại hay không (ngay cả khi nó dừng lại) và phần thứ hai kiểm tra xem dịch vụ hiện tại có thực sự đang chạy hay không. Bạn có thể muốn đưa điều này vào ví dụ của mình cho những người đọc trong tương lai chỉ lướt qua câu trả lời được chấp nhận. Tôi nghĩ nó hữu ích.
Dzhuneyt

12

Đối với phiên bản 1.7.1, không có lệnh nào được tích hợp sẵn.

Thay vào đó, execcó thể được sử dụng theo cách tương tự.

Khi bạn chạy nó cho dịch vụ có một số container, nó sẽ chạy ok:

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

Nhưng khi bạn chạy nó cho dịch vụ không có container dịch vụ đang chạy , nó sẽ hiển thị lỗi:

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

Vì vậy, nó có thể được sử dụng để kiểm tra, có bất kỳ container "còn sống" nào cho dịch vụ cụ thể không.


5

Bạn có thể chạy:

docker-compose ps -q service-name

Và bạn sẽ nhận được id của container nếu service-nameđang chạy. Cái gì đó như:

18a04e61240d8ffaf4dc3f021effe9e951572ef0cb31da7ce6118f681f585c7f

Nếu dịch vụ không chạy thì đầu ra trống, vì vậy nếu bạn muốn sử dụng điều này trong một tập lệnh, bạn có thể làm một cái gì đó như:

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

Vâng, điều đó cũng làm việc. Đánh dấu đây là câu trả lời ngay bây giờ.
Ivan Kolmychek

12
Điều này không cho bạn biết liệu container có chạy hay không, chỉ là nó có tồn tại hay không. Hãy thử làm docker-compose upsau đó Ctrl-C. docker-compose pssau đó sẽ hiển thị rằng các trạng thái vùng chứa không "Lên", nhưng docker-compose ps -q service-namevẫn cung cấp cho bạn một id.
djanderson

2

Tôi có một nhu cầu tương tự. Tuy nhiên, tôi có một restart: alwaystrong môi trường của tôi. Vì vậy, nó có thể là một chút khó khăn để phát hiện nếu một cái gì đó bị hỏng và khởi động lại trong một vòng lặp.

Tôi đã thực hiện kiểm tra Icinga / Nagios để so sánh thời gian bắt đầu và thời gian bắt đầu. Có lẽ nó hữu ích cho người khác ở tuyến dưới:

#!/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

Nếu bạn giả sử kịch bản này:

  • các thùng chứa bắt đầu và chạy vô thời hạn hoặc dừng ngay lập tức với mã lỗi (nghĩa là thiếu cấu hình)
  • bạn chỉ thực hiện kiểm tra một lần sau khi docker-compose up -d trả về

bạn có thể kiểm tra xem có container nào bị dừng do lỗi với : docker ps -a | grep 'Exited (255)'.

Kiểm tra này hoạt động chính xác ngay cả trong trường hợp các container dự kiến ​​sẽ dừng ngay lập tức mà không có lỗi (tức là các thùng chứa dữ liệu), vì trạng thái của chúng (từ docker ps -a) được đánh dấu là Exited (0).

Ví dụ: trong docker-compose.yml, chúng tôi bắt đầu các thùng chứa của chúng tôi bằng:

command: sh -c 'node dotenv_check.js && pm2 start --no-daemon src/worker.js --watch'

Đối với php-fpm, chúng tôi sử dụng một lệnh tương tự:

command: >-
  sh -c '
  set -e;
  for PROJECT in frontend backend; do
    cd /var/www/$${PROJECT};
    php dotenv_check.php;
  done;
  php-fpm
  '

Các dotenv_check.jsdotenv_check.phplà các tập lệnh thoát với mã lỗi trong trường hợp thiếu một biến env cần thiết.

Các set -elệnh, nói với kịch bản để dừng lại trên báo lỗi, trong đó, lần lượt, ngay lập tức sẽ ngừng container. Giới thiệu về set-e


0

Còn cái này thì sao?

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

bạn liệt kê các quy trình, chọn các dòng trong đó "Lên" trong cột 4 và lọc qua cho khớp với tên dịch vụ.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.