Как я могу использовать инкрементную статическую регенерацию (ISR) Next.js при развертывании в Docker?
Интересно, как лучше всего развернуть приложение Next.js на Docker. Созданный образ Docker следует развернуть в двух разных средах: сначала в TEST, а затем — с использованием того же образа — в PROD. Каждая среда имеет свою собственную базу данных.
В этом случае нет смысла использовать SSG: есть две базы данных, и ни одна из них недоступна при сборке образа Docker (т.е. при выполнении «npm run build»). Однако имеет смысл генерировать страницы при запуске сервера Next.js («запуск npm») и с этого момента позволять ISR регенерировать страницы всякий раз, когда достигается интервал повторной проверки. Это возможно ?
Например, я мог бы представить себе какой-нибудь логический флаг (например, «revalidateOnStartup»), который вызывает начальную генерацию страницы в getStaticProps():
return {
props: {
//...
},
revalidate: 3600,
revalidateOnStartup: true
}
Я уже пытался использовать пустой набор данных во время сборки в getStaticProps() и установить интервал повторной проверки, например, 3600 (один час). Однако в этом случае приложение запускается с пустой страницей. Затем требуется один час, чтобы сработала первая повторная проверка и данные появились на странице. Мне как-то нужно сказать Next.js, чтобы он изначально не ждал этого интервала.
Альтернативой ISR (если это здесь невозможно) может быть использование SSR (рендеринга на стороне сервера) и CDN для кэширования.
1 ответ
Вы можете добиться этого, включив «npm run build» в качестве ENTRYPOINT Docker, прежде чем он запустит команду запуска.
Например, ENTRYPOINT "npm run build && npm run start"
Время запуска контейнера, очевидно, будет медленнее, но если вы используете что-то вроде Kubernetes, вы можете добавить проверку готовности, чтобы обновления не задерживались.
Таким образом, вы можете принимать переменные среды целевого объекта развертывания и взаимодействовать с API содержимого этой среды.
Вы все равно должны выполнить первоначальную сборку (с mocked/пустыми статическими реквизитами), чтобы разогреть кэш следующей сборки.
ОБНОВЛЕНИЕ: я написал сообщение в блоге, в котором обобщаются эти и некоторые другие альтернативы для людей, которые решают эту проблему: http://www.craigwardman.com/Blogging/BlogEntry/ssg-isr-and-environment-variables-in-next-js-и-докер