Как ждать, пока `docker start` не закончится? - PullRequest
0 голосов
/ 16 января 2019

Когда я запускаю docker start, кажется, что контейнер может быть не полностью запущен во время возврата команды docker start. Это так?

Есть ли способ дождаться полного запуска контейнера, прежде чем команда вернется? Спасибо.

Ответы [ 2 ]

0 голосов
/ 16 января 2019

Обычный способ убедиться, что контейнер полностью запущен (т. Е. Запущены службы, открыты порты и т. Д.), - это дождаться регистрации определенной строки. См. Этот пример Ожидание инициализации контейнеров Docker , связанное с PostgreSql и Rails.

Отредактировано:

Может быть другое решение, использующее HEALTHCHECK контейнеров Docker. Идея состоит в том, чтобы настроить контейнер с помощью команды проверки работоспособности, которая используется для определения, является ли основная служба полностью или нет. запустился и работает нормально.

Указанная команда выполняется внутри контейнера и устанавливает состояние работоспособности на starting, healthy или unhealthy в зависимости от кода выхода (0 - контейнер исправен, 1 - контейнер неисправен). Статус контейнера может быть восстановлен на хосте путем проверки работающего экземпляра (docker inspect).

Параметры проверки работоспособности можно настроить внутри Dockerfile или при запуске контейнера. Вот простой пример для PostgreSQL

 docker run --name postgres --detach \
  --health-cmd='pg_isready -U postgres' \
  --health-interval='5s' \
  --health-timeout='5s' \
  --health-start-period='20s' \
  postgres:latest && \
  until docker inspect --format "{{json .State.Health.Status }}" postgres| \
  grep -m 1 "healthy"; do sleep 1 ; done

В этом случае команда здоровья - pg_isready. Веб-сервис обычно использует curl, другие контейнеры имеют свои конкретные команды Сообщество докеров предоставляет такую ​​конфигурацию для нескольких официальных образов здесь

Теперь, когда мы перезапускаем контейнер (docker start), он уже настроен, и нам нужна только вторая часть:

docker start postgres && \
until docker inspect --format "{{json .State.Health.Status }}" postgres|\ 
grep -m 1 "healthy"; do sleep 1 ; done

Команда вернется, когда контейнер будет помечен как healthy

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

0 голосов
/ 16 января 2019

Отказ от ответственности, я не эксперт в Docker, и буду рад сам узнать, существует ли лучшее решение.

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

Так что, к сожалению, здесь нет ничего общего с докером. Обычно команды, используемые создателем образа Docker (в Dockerfile), должны быть организованы таким образом, чтобы контейнер можно было использовать после того, как команда docker start заканчивается на образе, и это лучший способ. Однако это не всегда так.

Вот пример:

Localstack, представляющий собой набор сервисов для локальной разработки с AWS, имеет образ докера, но, например, после запуска порт S3 еще не готов к подключению. Из того, что я понимаю, неготовый, хотя и незащищенный порт будет типичной ситуацией, на которую вы ссылаетесь.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...