2015-08-12 5 views
0

Я отправил этот вопрос изначально на Docker forums, но не получил ответа.Docker compose: можно моделировать ленивый запуск зависимых сервисов?

Мне интересно, как наилучшим образом будет модель набора услуг, назовем их db, web и batch. db - это просто исполняемый экземпляр сервера базы данных (думаю, MySQL). web - это веб-приложение, которое необходимо подключить к базе данных. batch - пакетное приложение, которому необходимо подключиться к той же базе данных (он может/будет работать параллельно с web). db должен быть запущен либо для web, либо для batch. Но web или batch могут запускаться независимо друг от друга (один или оба могут работать одновременно). Если оба они запускаются одновременно, они должны разговаривать с одним экземпляром базы данных (поэтому db фактически использует volumes_from отдельный контейнер объема данных). Так что если вариант использования был проще (подумайте только db и web, которые всегда работают вместе), тогда они просто оба будут определены как сервисы в одном файле компоновки, с web со ссылкой на db.

Насколько я понимаю, они не могут быть определены в одной конфигурации Docker. Вместо этого мне понадобились бы три разные конфигурации. Один для db, который запускается первым, один для web (который использует external_links, чтобы найти db), и третий для batch (который также использует external_links, чтобы найти db). Это правильно или есть какой-то механизм, который я не рассматриваю? Предполагая, что требуется настройка с несколькими конфигурациями, существует ли способ «лениво» инициализировать композицию db, если она не работает, когда запускаются либо композиции web310, либо batch?

ответ

-1

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

В зависимости от докеров изображений, которые вы используете для web и batch услуг, вы должны переопределить CMD, ENTRYPOINT или обоих.

This question имеет примеры сценария оболочки, который ожидает, что служба MySQL будет работать.

И here - другая техника для тестирования, если открыт сетевой порт.

+0

Это вопрос о том, как правильно использовать другие приложения в зависимости от базы данных. Но я до сих пор неясно, имеет ли Docker или Docker Compose встроенное средство для * запуска самой базы данных * в момент запуска любой из зависимых служб (что, очевидно, должно было бы обрабатывать состояние, в котором БД еще не установлена Бег). –

+0

Docker и docker-compose оба не имеют понятия о том, что происходит внутри контейнеров. И это не их бизнес, чтобы знать, что это – Thomasleveil

+0

Это правильно. Однако docker-compose позволяет вам внешне определять эти зависимости (через 'links',' external_links' и т. П.). Мой вопрос был предназначен в этом контексте моделирования. –

1

Если web имеет ссылку, определенную на db, в файле, составляющем файл докеры, db всегда будет начинаться первым.

Насколько я знаю, Docker никогда не узнает, когда база данных будет работать. Обязанность вашего контейнера web правильно начать и повторить попытку, пока база не закончится (с таймаутом).

Для вашего batch службы, при условии, что вы не хотите, чтобы запустить его каждый раз, когда вы начинаете ваши web и db контейнеров (с использованием docker-compose up или run), вы можете попробовать продлив службу. См. docs для получения дополнительной информации об этом.