无法在Docker容器中运行Next.js应用的排查求助
Next.js App Router 应用Docker容器运行空响应问题
我正在学习Next.js,使用create-next-app搭建了一个简易应用,本地通过npm run dev可正常运行,现尝试配置使其在Docker容器中运行。
参考Vercel的多环境Docker示例,对Dockerfile仅做了两处修改:
- 在
npm run build命令前添加ENV NODE_TLS_REJECT_UNAUTHORIZED=0,因本地开发版本需从带自签名证书的本地API获取数据 - 在runner阶段添加了几个额外的复制命令(不确定是否必要,也不清楚standalone目录是否包含应用所需的所有文件)
我还添加了一个next.config.js文件,内容如下以强制独立构建:
module.exports = { output: 'standalone', }
运行生成的容器后,访问http://localhost:3001仅得到空响应。但进入容器shell查看,文件似乎符合我对Next.js的有限认知:

我注意到Vercel示例使用Pages路由,而我的应用使用App Router,但不确定这是否需要修改Dockerfile。
完整的Dockerfile内容:
FROM node:18-alpine AS base # 1. 仅在需要时安装依赖 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 corepack enable pnpm && pnpm i; \ else echo "Lockfile not found." && exit 1; \ fi # 2. 仅在源码变更时重新构建 FROM base AS builder WORKDIR /app COPY --from=deps /app/node_modules ./node_modules COPY . . COPY .env.dev .env.production ENV NODE_TLS_REJECT_UNAUTHORIZED=0 RUN npm run build # 3. 生产镜像,复制所有文件并运行Next.js FROM base AS runner WORKDIR /app ENV NODE_ENV=production RUN addgroup -g 1001 -S nodejs RUN adduser -S nextjs -u 1001 COPY --from=builder /app/public ./public COPY --from=builder /app/next.config.js ./ COPY --from=builder /app/.env ./.env COPY --from=builder /app/.env.production ./.env.production # 自动利用输出追踪减小镜像体积 COPY --from=builder --chown=nextjs:nodejs /app/.next/standalone ./ COPY --from=builder --chown=nextjs:nodejs /app/.next/static ./.next/static USER nextjs EXPOSE 3000 ENV PORT 3000 CMD HOSTNAME=localhost node server.js
内容的提问来源于stack exchange,提问作者Tom Troughton
相关产品推荐
相关产品推荐

