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