Docker部署NextJS 14应用出现连接拒绝问题求助
问题:Docker Compose部署NextJS 14应用后无法访问,返回Empty reply from server
我通过Docker Compose运行多个应用,其他应用均可正常访问(比如http://localhost:8082能收到正常响应),但新部署的NextJS 14应用无法访问。执行curl http://localhost:8100返回:
curl: (52) Empty reply from server
容器启动日志显示NextJS已就绪:
> ▲ Next.js 14.1.0 > - Local: http://localhost:8100 > - Network: http://0.0.0.0:8100 > ✓ Ready in 219ms
相关配置文件
docker-compose.yml
version: '3' services: admin: image: 'registry.gitlab.com/...react-app:latest' container_name: admin restart: always expose: - 8082 ports: - 8082:80 networks: - app-network nextjs-app: image: 'registry.gitlab.com/...nextjs-14-app:latest' container_name: nextjs-app restart: always expose: - 8100 ports: - 8100:80 networks: - app-network environment: - NODE_ENV=production networks: app-network: driver: bridge
Dockerfile
FROM node:18-alpine AS base FROM base AS deps RUN apk add --no-cache libc6-compat WORKDIR /app COPY package.json yarn.lock* package-lock.json* pnpm-lock.yaml* ./ RUN \ if [ -f yarn.lock ]; then yarn --frozen-lockfile; \ elif [ -f package-lock.json ]; then npm ci; \ elif [ -f pnpm-lock.yaml ]; then yarn global add pnpm && pnpm i --frozen-lockfile; \ else echo "Lockfile not found." && exit 1; \ fi FROM base AS builder WORKDIR /app COPY --from=deps /app/node_modules ./node_modules COPY . . ENV NEXT_TELEMETRY_DISABLED 1 RUN npx prisma generate RUN yarn build FROM base AS runner WORKDIR /app ENV NODE_ENV production ENV NEXT_TELEMETRY_DISABLED 1 RUN addgroup --system --gid 1001 nodejs RUN adduser --system --uid 1001 nextjs COPY --from=builder /app/public ./public RUN mkdir .next RUN chown nextjs:nodejs .next RUN chown nextjs:nodejs public COPY --from=builder --chown=nextjs:nodejs /app/.next/standalone ./ COPY --from=builder --chown=nextjs:nodejs /app/.next/static ./.next/static USER nextjs EXPOSE 8100 ENV PORT 8100 ENV HOSTNAME "0.0.0.0" CMD ["node", "server.js"]
解决方法
1. 修正端口映射(核心问题)
docker-compose中nextjs-app的端口映射错误:外部端口8100被映射到容器内的80端口,但根据Dockerfile配置,NextJS实际运行在容器内的8100端口。容器内80端口没有服务监听,导致外部请求返回空响应。
修正后的nextjs-app配置:
nextjs-app: image: 'registry.gitlab.com/...nextjs-14-app:latest' container_name: nextjs-app restart: always expose: - 8100 ports: - 8100:8100 # 外部端口8100映射到容器内8100端口 networks: - app-network environment: - NODE_ENV=production
2. 验证容器内服务状态
如果修正映射后仍有问题,进入容器内部验证服务是否正常:
docker exec -it nextjs-app curl localhost:8100
如果能正常返回页面内容,说明容器内服务正常,问题可能出在网络或端口转发层面;如果仍返回错误,检查服务启动日志或文件权限。
3. 检查文件权限(可选)
Dockerfile中已配置nextjs用户权限,但可确认容器内相关目录权限是否正确:
docker exec -it nextjs-app ls -la /app
确保.next和public目录的所有者是nextjs:nodejs,避免服务因权限不足无法读取文件。
内容的提问来源于stack exchange,提问作者wvp
相关产品推荐
相关产品推荐

