Существует несколько подходов, но имейте в виду, что по умолчанию службы запускаются в произвольном порядке с использованием Docker Compose и, даже если вы используете depends_on
, это только проверяет, работают ли контейнеры (например, redis
), а не что онизавершен процесс инициализации.
1.Самый простой: Предварительное создание
См. Опцию запуска образа redis
с постоянным хранилищем:
https://hub.docker.com/_/redis/
Используя этот подход, вы либо смонтируетелокальный каталог в каталоге /data
контейнера или создает том (данные) и использует его.Затем вы должны предварительно заполнить сервер redis, запустив против него redis-cli
.
Один из способов сделать это - запланированный файл docker-compose.yml
, но docker-compose --file=/path/to/docker-compost.yaml up redis
, где redis
- это имяслужбы Redis тоже.Вам необходимо убедиться, что служба redis
доступна с хоста --ports: 6379:6379
, возможно, чтобы внешний redis-cli
мог получить к ней доступ.
Этот подход хорошо работает только для локального использования, но не облегчаетразвертывание решения в другом месте.
2.Отказоустойчивость: тест на ключи
Docker Compose - насколько мне известно - не предлагает элегантного эквивалента инициатным контейнерам Kubernetes, которые запускаются до зависимого контейнера.
С помощью Docker Compose вы можете включить инициализацию (запустить один раз) redis-cli
, чтобы заполнить сервер, но затем вы должны дополнить все клиенты, чтобы проверить, что это выполнено или наличие этих данных перед запуском (успешно).
Самым простым решением для этого является сбой клиентов Redis и restart: always
, если ключи Redis отсутствуют.
Более продвинутым решением будет определение проверки работоспособности на наличиеключи redis, а затем depends_upon: ... condition: service_healthy
(см. ссылка )
См. также порядок запуска в Docker Compose, описанный здесь