Как определить, выполняется ли запуск программы докеры программно?
Я пишу очень простой bash script, чтобы быстро проверить, что мой контейнер все еще строит и запускается правильно и что приложение внутри отвечает на запросы.
Иногда docker run
выходит из строя, например. потому что порт, который я пытаюсь связать с контейнером, уже выделен. Но когда это произойдет, docker run
код завершения все равно 0, поэтому я не могу использовать код выхода. Как программно проверить, правильно ли запущен контейнер?
Решения, которые я рассматриваю, следующие:
- проанализировать вывод для ошибок
-
docker ps
, чтобы увидеть, работает ли контейнер
но эти оба кажутся немного переполненными и уродливыми. Не хватает ли лучшего способа проверить, удалось ли docker run
?
Ответы
Ответ 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 снова не работает.
Надеюсь, поможет...
;-)