Я пишу очень простой сценарий bash, чтобы быстро проверить, что мой контейнер по-прежнему строится и запускается правильно и что приложение внутри отвечает на запросы.
Иногда происходит docker run
сбой, например, потому что порт, к которому я пытаюсь привязать контейнер, уже выделен. Но когда это происходит docker run
, код выхода по-прежнему равен 0, поэтому я не могу использовать код выхода. Как я могу программно проверить правильность запуска контейнера?
Я рассматриваю следующие решения:
- проанализировать вывод на наличие ошибок
docker ps
чтобы увидеть, запущен ли контейнер
но они оба кажутся немного излишними и уродливыми. Мне не хватает лучшего способа проверить, docker run
удалось ли ?
docker run
вернет ненулевой код возврата в случае неудачи, как вы указываете, тогда все, что вы можете сделать, это проанализировать вывод (который может быть сложным или хрупким) или использовать другую команду (т.е. вашеps
предложение ), чтобы проверить результат первой команды. Возможно, вы захотите подать заявку в Docker, чтобы узнать, могут ли они также исправить код возвратаrun
.docker run -d -p 9010:9010 busybox true ; echo $?
Ответы:
Как предложил Абель Муйно в комментариях, это могло быть исправлено в более поздних версиях 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
(или больше) между запуском контейнера и проверкой, работает ли он. Если что-то не так с вашей настройкой, возможно, она будет отображаться как «запущенная» в течение очень короткого времени, прежде чем фактически завершится.источник
docker inspect -f {{.State.Running}} <container-id>
использоватьjq
вместо этого? Просто интересуюсь.2> /dev/null
.2> /dev/null
поскольку она ничего не оценивает. Как я могу сделать это по умолчанию,false
если контейнер не существует?Чтобы ничего не анализировать, вы можете использовать docker top , который возвращает 1, если контейнер не запущен:
id=$(docker run mycontainer) if ! docker top $id &>/dev/null then echo "Container crashed unexpectedly..." return 1 fi
источник
Мы могли бы использовать
docker exec $id true 2>/dev/null || echo not running
.Эта команда не записывает в stdout, как docker top. Он пишет в stderr, когда контейнер не запущен, то же сообщение, что и «docker top».
источник
Применение вышеупомянутых предложений к сценарию.
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:
Перейдите к последней строке и добавьте файл сценария. Например:
3 - Сохраните crontab и никогда не беспокойтесь о том, что ваш контейнер Docker снова упадет.
Надеюсь, поможет...
;-)
источник
Пришлось использовать:
(контейнер был в состоянии запущен, но служба внутри контейнера не была полностью запущена.
Часть вывода проверки:
"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": []
источник