#mongodb #docker #docker-compose #next.js #strapi
#mongodb #docker #docker-compose #next.js #страпи
Вопрос:
Я пытаюсь контейнеризировать три изображения: мой Next.js приложение, изображение Strapi и база данных Mongo.
У меня есть файл Dockerfile с инструкциями для моего Next.js применение:
FROM node:14.15.0
WORKDIR /usr/src/app
COPY package*.json ./
RUN npm install
COPY . .
EXPOSE 3000
RUN npm run build
CMD [ "npm", "start" ]
И я собираю все изображения в своем docker-compose.yml:
version: "3.7"
services:
mongo:
container_name: example-mongo
image: mongo:latest
env_file: .env
environment:
MONGO_INITDB_DATABASE: ${DATABASE_NAME}
volumes:
- ./data:/data/db
ports:
- '27017:27017'
strapi:
container_name: example-strapi
image: strapi/strapi:latest
env_file: .env
volumes:
- ./strapi-app:/usr/src/strapi-app
ports:
- '1337:1337'
app:
container_name: example-app
build:
context: .
dockerfile: Dockerfile
depends_on:
- mongo
- strapi
env_file:
- .env
volumes:
- .:/usr/src/app
ports:
- '3000:3000'
volumes:
data:
strapi-app:
Мой файл .env выглядит следующим образом:
DATABASE_CLIENT=mongo
DATABASE_HOST=mongo
DATABASE_PORT=27017
DATABASE_NAME=example
Проблема в том, что когда мой Next.js приложение запущено npm run build
, оно завершается с ошибкой при попытке подключиться к базе данных Mongo (строка подключения, в которой он завершается с ошибкой: mongodb://mongo:27017/example
). Ошибка MongooseServerSelectionError: getaddrinfo ENOTFOUND mongo
.
Из того, что я нашел на форумах и в некоторых темах, это обычно указывает на некоторые внутренние проблемы Docker с DNS. Он не может преобразовать mongo в IP-адрес службы Mongo DB.
Я попытался запустить только образ strapi с Mongo DB, при этом он может подключаться к Mongo DB без сбоев. Мне не хватает какой-то конфигурации для моего Next.js применение? Вот пример с голыми костями, который повторяет проблему, для всех, кто заинтересован: https://gitlab.com/jan.kraus.cf/next-mongo-strapi
Ответ №1:
Вы получаете эту ошибку на этапе сборки вашей среды. Это выполняется до запуска любых контейнеров, поэтому, конечно mongo
, сервис недоступен.
Вы можете воспроизвести это, просто запустив docker build .
в каталоге, содержащем ваш Dockerfile. Это доходит до:
Step 7/8 : RUN npm run build
---> Running in 28aa6347395f
> learn-starter@0.1.0 build /usr/src/app
> next build
И вскоре после этого терпит неудачу с:
info - Collecting page data...
Trying to connect to MongoDB on: mongodb://mongo:27017/example
MongooseServerSelectionError: getaddrinfo ENOTFOUND mongo
[...]
Ваша сборка не может иметь зависимостей от внешних баз данных или других ресурсов. Все подобное должно происходить во время выполнения, а не во время сборки.
Комментарии:
1. Ах да. Это означает, что я не могу использовать Next.js Статическая генерация сайта и использование серверной части. Рендеринг или рендеринг на стороне клиента. Есть ли способ отложить процесс сборки службы docker до тех пор, пока не будет запущена и запущена другая служба?
2. Вероятно, вы можете использовать Next.js ; вам просто нужно организовать его запуск при запуске контейнера (например, с помощью
ENTRYPOINT
скрипта или как часть вашегоCMD
скрипта), а не во время сборки. Вероятно, вам также потребуется учитывать ситуацию, в которой ваш контейнер приложений запускается до того, как MongoDB будет готов обрабатывать запросы.