Docker化Next.js应用时提示找不到生产构建目录的问题
问题根源
你遇到的错误核心原因是docker-compose中的本地目录挂载覆盖了容器内的构建产物:volumes: - ./:/app 将你本地的项目目录直接挂载到容器的/app路径,完全覆盖了镜像构建时复制进去的.next目录,导致容器启动时找不到生产构建文件。
解决方案
1. 修正docker-compose配置(移除本地挂载)
生产环境下不需要挂载本地代码,镜像本身已经包含了构建完成的应用。修改后的docker-compose.yml:
version: '3' services: playgames-frontend: build: . ports: - "3000:7777" # 匹配prod阶段设置的PORT=7777 environment: - NEXT_PUBLIC_PRODUCTION_ENDPOINT=${NEXT_PUBLIC_PRODUCTION_ENDPOINT} - NEXT_PUBLIC_PAGE=${NEXT_PUBLIC_PAGE} - NEXT_PUBLIC_STRIPE_KEY=${NEXT_PUBLIC_STRIPE_KEY} - SCHEMA_ENDPOINT=${SCHEMA_ENDPOINT}
2. 优化Dockerfile(修复构建细节)
原Dockerfile存在两个小问题:构建阶段未传递环境变量、缺失public静态资源复制。优化后的版本:
FROM node:14-alpine3.14 as deps ARG NEXT_PUBLIC_PRODUCTION_ENDPOINT ARG NEXT_PUBLIC_PAGE ARG NEXT_PUBLIC_STRIPE_KEY ARG SCHEMA_ENDPOINT RUN apk add --no-cache libc6-compat RUN mkdir /app && chown -R node:node /app WORKDIR /app COPY --chown=node:node package.json package-lock.json ./ RUN npm install && npm cache clean --force FROM node:14-alpine3.14 as build RUN mkdir /app && chown -R node:node /app WORKDIR /app ENV NODE_ENV=production # 传递构建时的环境变量,确保Next.js静态构建能注入这些值 ARG NEXT_PUBLIC_PRODUCTION_ENDPOINT ARG NEXT_PUBLIC_PAGE ARG NEXT_PUBLIC_STRIPE_KEY ARG SCHEMA_ENDPOINT ENV NEXT_PUBLIC_PRODUCTION_ENDPOINT=$NEXT_PUBLIC_PRODUCTION_ENDPOINT ENV NEXT_PUBLIC_PAGE=$NEXT_PUBLIC_PAGE ENV NEXT_PUBLIC_STRIPE_KEY=$NEXT_PUBLIC_STRIPE_KEY ENV SCHEMA_ENDPOINT=$SCHEMA_ENDPOINT COPY --chown=node:node . ./ COPY --from=deps /app/node_modules ./node_modules RUN npm run build FROM node:14-alpine3.14 as prod RUN mkdir /app && chown -R node:node /app WORKDIR /app ENV NODE_ENV=production ENV PORT=7777 COPY --chown=node:node package.json package-lock.json ./ RUN npm ci --production && npm cache clean --force COPY --from=build /app/.next ./.next COPY --from=build /app/next.config.js ./ # 复制public目录,避免静态资源缺失 COPY --from=build /app/public ./public USER node CMD ["node_modules/.bin/next", "start"]
3. 重新构建并运行
执行以下命令重新部署:
docker-compose build docker-compose up -d
内容的提问来源于stack exchange,提问作者pythonc229
相关产品推荐
相关产品推荐

