Docker无法在内部将服务名称转换为IP地址

时间:2020-11-10 22:14:28

标签: mongodb docker docker-compose next.js strapi

我试图将三个图像容器化:我的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转换为Mongo DB服务的IP地址。

我尝试仅在Mongo DB上运行bandi映像,因为它可以无中断地连接到Mongo DB。我是否缺少Next.js应用程序的某些配置?这是一个简单的示例,它对感兴趣的任何人都可以复制该问题:https://gitlab.com/jan.kraus.cf/next-mongo-strapi

1 个答案:

答案 0 :(得分:1)

您在环境的 build 阶段遇到该错误。该操作会在任何容器启动之前运行,因此mongo服务当然不可用。

您只需在包含Dockerfile的目录中运行docker build .即可重现此内容。它可以达到:

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
[...]

您的构建不能依赖于外部数据库或其他资源。诸如此类的任何事情都需要在 run 时间而不是 build 时间发生。

相关问题