Как я могу использовать инкрементную статическую регенерацию (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-и-докер

Другие вопросы по тегам