我试图将三个图像容器化:我的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
答案 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 时间发生。