В kubernetes эта функциональность может быть достигнута, если во время развертывания запустить контейнер init при развертывании и установить максимальное увеличение до 1, гарантируя, что только один модуль попытается выполнить миграцию перед развертыванием в другие контейнеры.
В целом, это не очень хорошая практика, даже в Kubernetes.
В идеале ваш код переноса БД должен быть idempotent . Особенно в безсерверном мире вы обнаружите, что отсутствие этих примитивов удивительно, если вы не поменяете мышление и не задумаетесь об этих концепциях.
Стратегия развертывания Cloud Run заключается в настройке ручного трафика traffi c split - который маршрутизирует traffi c между ревизиями на основе заданного вами процента.
Вы можете разработать новую ревизию службы облачного запуска, получая 0% трафика c.
После развертывания ревизии облачный запуск будет по-прежнему запустить хотя бы один контейнер, чтобы увидеть, станет ли приложение готовым (т. е. процесс начинает прослушивать PORT). Тем не менее, вы, вероятно, не должны полагаться на только 1 экземпляр , возникающий во время этого процесса, поскольку это не гарантированное поведение.
Используя этот трюк, вы можете выполнить миграцию БД (обратите внимание на " «Ограничения» в разделе документации по таймаутам запуска) до прослушивания номера порта. Но вам нужно написать какую-то логи c (или использовать внешний механизм блокировки / синхронизации), чтобы гарантировать, что путь к коду не будет выполняться снова и снова в будущем (или одновременно во время миграции).