Docker не может внутренне преобразовать имя службы в IP-адрес

#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 будет готов обрабатывать запросы.