2016-09-13 5 views
4

У меня есть приложение, состоящее из простого приложения Node и Mongo db. Интересно, как я мог запускать миграцию базы данных в режиме роуминга докеров?Переходы базы данных в режиме роуминга докеров

Без режима роя бегаю миграции, остановив первый старую версию приложения, запуск одноразовой команды миграции с новой версией приложения, а затем, наконец, начать новую версию приложения:

# Setup is roughly the following 
$ docker network create appnet 
$ docker run -d --name db --net appnet db:1 
$ docker run -d --name app --net appnet -p 80:80 app:1 

# Update process 
$ docker stop app && docker rm app 
$ docker run --rm --net appnet app:2 npm run migrate 
$ docker run -d --name app --net appnet -p 80:80 app:2 

Теперь я m тестирование установки в режиме докеров, чтобы я мог легко масштабировать app. Проблема заключается в том, что в режиме рой один не может начать контейнеры в роя сети и, таким образом, я не могу достигнуть дб для запуска миграции:

$ docker network ls 
NETWORK ID   NAME    DRIVER    SCOPE 
6jtmtihmrcjl  appnet    overlay    swarm 

# Trying to replicate the manual migration process in swarm mode 
$ docker service scale app=0 
$ docker run --rm --net appnet app:2 npm run migrate 
docker: Error response from daemon: swarm-scoped network (appnet) is not compatible with `docker create` or `docker run`. This network can only be used by a docker service. 

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

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

Редактировать

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

$ docker service scale app=0 
$ docker service create --name app-migrator --network appnet app:2 npm run migrate 

# Check when the first app-migrator task is finished and check its output 
$ docker service ps app-migrator 
$ docker logs <container id from app-migrator> 
$ docker service rm app-migrator 

# Ready to update the app 
$ docker service update --image app:2 --replicas 2 app 
+1

Этого случай использования держит придумывает. Существует проблема Github с обсуждением [здесь] (https://github.com/docker/docker/issues/23880). Я лично использую общую услугу «обслуживания» и называю «обновление докере-сервиса ...», чтобы заставить ее создавать новые задачи (контейнеры) для запрошенной работы. – Alkaline

ответ

3

Я считаю, что вы можете исправить эту проблему, сделав свою оверлейную сеть, appnet, прикрепляемой. Это может быть достигнуто с помощью следующей команды:

docker network create --driver overlay --attachable appnet 

Это должно исправить ошибку сети рои в области видимости и и позволяет запускать миграции

+0

Да! Docker 1.13 принес нам этот флаг '--attachable', который позволяет запускать одиночные контейнеры, подключенные к сети наложения роя. Милая! Я попробовал, и он работает так, как ожидалось. – ronkot

0

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

Как я сделать это прямо сейчас (хотя и не очень элегантно, она работает), использует message queue (я использую redis), при запуске приложения, он будет посылать сообщение в в queue, сообщая ему, что необходимо выполнить задачу migration. На другом конце queue у меня есть listener app, который обработает queue и запустит задачу migration. Задача миграции будет выполняться только один раз, так как существует только один экземпляр listener, выполняющий его последовательно. Поэтому я просто использую queue & listener app, чтобы убедиться, что задача migration выполняется только один раз.

+0

Трудная ситуация, действительно :) Возможно, ваше решение будет таким, как сейчас, если бы у меня была такая инфраструктура уже на месте. Но в моем случае это слишком тяжелое решение для запуска некоторых случайных административных команд против db. Я отредактировал свой вопрос и добавил один грязный способ запуска случайных команд в роевой сети. Это решение по-прежнему далека от приемлемого, но сейчас лучше всего в моих руках.Спасибо за ваш вклад! – ronkot

Смежные вопросы