Подтвердить что ты не робот

Как определить, выполняется ли запуск программы докеры программно?

Я пишу очень простой bash script, чтобы быстро проверить, что мой контейнер все еще строит и запускается правильно и что приложение внутри отвечает на запросы.

Иногда docker run выходит из строя, например. потому что порт, который я пытаюсь связать с контейнером, уже выделен. Но когда это произойдет, docker run код завершения все равно 0, поэтому я не могу использовать код выхода. Как программно проверить, правильно ли запущен контейнер?

Решения, которые я рассматриваю, следующие:

  • проанализировать вывод для ошибок
  • docker ps, чтобы увидеть, работает ли контейнер

но эти оба кажутся немного переполненными и уродливыми. Не хватает ли лучшего способа проверить, удалось ли docker run?

4b9b3361

Ответ 1

Как было предложено Abel Muiño в комментариях, это, возможно, было исправлено в более поздних версиях Docker (в настоящее время я использую 0.9.1).

Но, если вы временно застряли, как я, с более старой версией, я нашел подходящее обходное решение, чтобы проверить, запущен ли контейнер с помощью docker inspect.

docker inspect возвращает объект JSON с большим количеством информации о контейнере и, в частности, является ли контейнер в данный момент запущенным или нет. Флаг -f позволяет вам легко извлекать необходимые бит:

docker inspect -f {{.State.Running}} $CONTAINER_ID

или же

docker inspect -f "{{.State.Running}}" $CONTAINER_ID

вернет true или false.

Обратите внимание, что вы, вероятно, хотите sleep 1 (или больше) между запуском контейнера и проверкой, если он установлен. Если что-то не так с вашей настройкой, возможно, что он будет казаться "запущенным" в течение очень короткого времени до фактического выхода.

Ответ 2

Чтобы избежать разбора чего-либо, вы можете использовать верхнюю часть докера, которая возвращает 1, если контейнер не запущен:

id=$(docker run mycontainer)
if ! docker top $id &>/dev/null
then
    echo "Container crashed unexpectedly..."
    return 1
fi

Ответ 3

Мы могли бы использовать docker exec $id true 2>/dev/null || echo not running.

Эта команда не записывает в stdout, как это делает "docker top". Он записывает stderr, когда контейнер не запущен, то же сообщение, что и "докерный верх".

Ответ 4

Я должен был использовать:

$ docker inspect -f {{.State.Health.Status}} xxx

(контейнер находился в рабочем состоянии, но служба внутри контейнера не была полностью запущена.

Часть проверки выходных данных:

"State": {
    "Status": "running",
    "Running": true,
    "Paused": false,
    "Restarting": false,
    "OOMKilled": false,
    "Dead": false,
    "Pid": 1618,
    "ExitCode": 0,
    "Error": "",
    "StartedAt": "2019-03-08T10:39:24.061732398Z",
    "FinishedAt": "0001-01-01T00:00:00Z",
    "Health": {
        "Status": "starting",
        "FailingStreak": 0,
        "Log": []

Ответ 5

Применение вышеупомянутых предложений к сценарию.

1 - Создать скрипт скрипта keepMyDockerUp.sh:

vi keepMyDockerUp.sh


#!/bin/bash
Container_ID=INSERT_YOUR_CONTAINER_ID HERE
result=$( docker inspect -f {{.State.Running}} $Container_ID)
echo "result is" $result
if [ $result = "true" ]
then
echo "docker is already running"
else
systemctl restart docker
docker start $Container_ID
fi

2 - Затем просто добавьте его в cron, чтобы ваш скрипт проверял время от времени ваш контейнер Docker:

crontab -e

Перейти к последней строке и добавить свой файл сценария. Например:

* * * * * /root/keepMyDockerUp.sh

3 - Сохраните crontab и никогда не беспокойтесь о том, что ваш контейнер Docker снова не работает.

Надеюсь, поможет...

;-)