我目前正在尝试为一个应用程序创建一个两阶段构建,该应用程序运行于Next.js (版本12.0.6),并有一个用于API的自定义服务器。我不想在每次停靠器运行时重新构建应用程序,所以我将编译的文件复制到/app目录中。我假设页面目录将在.next文件夹中自动工作,但不幸的是,它不能工作。
虽然这个应用程序构建得很好,但我被这个问题困扰着:
Error: > Couldn't find a `pages` directory. Please create one under the project root
at Object.findPagesDir (/app/node_modules/next/dist/lib/find-pages-dir.js:33:11)
at /app/node_modules/next/dist/build/index.js:113:45
at async Span.traceAsyncFn (/app/node_modules/next/dist/trace/trace.js:74:20)
at async Object.build [as default] (/app/node_modules/next/dist/build/index.js:82:25)
我的Docker文件如下所示:
FROM node:lts-slim AS base
WORKDIR /base
COPY package*.json ./
RUN npm install
COPY . .
FROM base AS build
ENV NODE_ENV=production
WORKDIR /build
COPY --from=base /base ./
CMD mkdir ./pages
RUN npm run build
FROM node:lts-slim AS production
ENV NODE_ENV=production
WORKDIR /app
COPY --from=build /build/next.config.js ./
COPY --from=build /build/package*.json ./
COPY --from=build /build/.next ./.next
COPY --from=build /build/public ./public
COPY --from=build /build/dist ./dist
# RUN mkdir pages; < uncommenting this will silence the error but it's an empty fake directory
RUN npm install
EXPOSE 3000
CMD npm run start
我像这样启动Next.js服务器(对于dev属性也尝试了硬编码false,但没有成功):
const dev = process.env.NODE_ENV !== "production";
const app = next({ dev });
项目中的国家预防机制命令如下:
"scripts": {
"prestart": "next build",
"dev": "NODE_ENV=development ts-node --project tsconfig.server.json server/index.ts",
"next-dev": "next dev",
"build:server": "tsc --project tsconfig.server.json",
"build:next": "next build",
"build": "npm run build:next && npm run build:server",
"next-start": "next start",
"start": "NODE_ENV=production node ./dist/server/index.js",
"test": "jest"
},
到目前为止我尝试过的事情:
有人能告诉我如何解决这个问题吗?我完全没有想法了,希望我在这里错过了一些愚蠢的东西。
谢谢!
发布于 2022-03-06 18:55:34
我自己回答,因为我得到它“工作”,它可能会帮助其他人。
出于一个我无法理解的原因,在package.json中创建一个单独的运行脚本可以阻止Next.js在应用程序启动时重新编译自己。
重申所采取的步骤:
使用npm的recompile.
很管用,但我不知道为什么。如果有人有洞察力的话,我很高兴听到!
https://stackoverflow.com/questions/70236426
复制相似问题