SSR Next.js React应用Docker部署异常:无法访问容器服务
问题排查与修复方案
核心问题1:端口映射不匹配
你的Dockerfile production阶段明确设置了ENV PORT=3001且EXPOSE 3001,说明容器内的Next.js服务运行在3001端口,但docker-compose里的端口映射写成了"3001:80"——主机3001端口映射到容器80端口,而容器80端口无服务监听,直接导致无法访问。
修复方法:修改docker-compose的ports配置:
ports: - "3001:3001"
核心问题2:Production阶段配置冗余且不合理
- 你已定义
builder构建阶段,但production阶段未复用其产物,反而重新执行COPY . .和npm run build,既浪费构建时间,还可能引入不必要的本地文件。 - production环境挂载本地目录的volumes完全没必要,这会覆盖镜像内的生产代码与构建产物,破坏镜像一致性,甚至可能因本地未执行build导致容器内无运行产物。
修复Dockerfile(production阶段):
FROM node:18-alpine AS production WORKDIR /app ENV NODE_ENV=production ENV NEXT_PUBLIC_APP_ENV=production ENV PORT=3001 # 仅复制生产依赖 COPY package*.json ./ RUN npm ci --only=production # 复用builder阶段的构建产物 COPY --from=builder /app/.next ./.next COPY --from=builder /app/public ./public COPY --from=builder /app/package.json ./package.json EXPOSE 3001 USER node CMD [ "npm", "start" ]
修复docker-compose(移除不必要的volumes):
version: '3.8' services: app: image: nextjs_zaahib build: context: ./ target: production dockerfile: Dockerfile ports: - "3001:3001"
验证步骤
- 停止并清理现有容器:
docker compose down - 重新构建镜像并启动服务:
docker compose up -d --build - 查看容器日志确认启动状态:
docker compose logs app,若出现类似ready - started server on 0.0.0.0:3001, url: http://localhost:3001的日志,说明服务正常运行 - 访问
http://localhost:3001即可打开应用
内容的提问来源于stack exchange,提问作者Wael Salah
相关产品推荐
相关产品推荐

