Обычный способ убедиться, что контейнер полностью запущен (т. Е. Запущены службы, открыты порты и т. Д.), - это дождаться регистрации определенной строки. См. Этот пример Ожидание инициализации контейнеров 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
Надеюсь, это поможет.