Я видел множество примеров создания контейнеров Docker для приложений Rails. Обычно они запускают сервер рельсов и имеют CMD, который запускает миграцию/настройку, а затем возвращает сервер Rails.
Если я создаю 5 из этих контейнеров одновременно, как Rails обрабатывает несколько процессов, пытающихся инициировать миграцию? Я вижу, что Rails проверяет текущую версию схемы в общем журнале запросов (это база данных MySQL):
SELECT `schema_migrations`.`version` FROM `schema_migrations`
Но я вижу состояние гонки здесь, если это происходит одновременно с разными экземплярами Rails.
Учитывая, что DDL не является транзакционным в MySQL, и я не вижу каких-либо блокировок, происходящих в общем журнале запросов при выполнении миграций (кроме транзакций для каждой миграции), казалось бы, что их одновременное отключение будет плохая идея. На самом деле, если я удаляю это три раза локально, я вижу, как два экземпляра рельсов разбиваются при попытке создать таблицу, потому что она уже существует, в то время как третий экземпляр rails успешно завершает миграцию. Если это была миграция, которая вставляла что-то в базу данных, это было бы очень опасно.
Лучше ли вы запускать один контейнер, который запускает миграцию/настройку, затем порождает (например) экземпляр Unicorn, который, в свою очередь, порождает нескольких работников рельсов?
Должен ли я создавать нереляционные контейнеры и один "контейнер миграции", который запускает миграцию, затем выходит?
Есть ли лучший вариант?