错误:在 Docker / Next 14 / Node 20 / React 18 中找不到模块“next”

问题描述 投票:0回答:1

我目前正在开发一个 React Next 项目,该项目在 Node 16.19 上运行良好。我将 Node 升级到 v20.14,Next 从 v12.4 升级到 v14.2,Yarn 从 v1.22 升级到 v4.3,并将大多数其他依赖项升级到较新的版本。在迁移遇到一些麻烦之后,它通过在根 package.json 上运行我常用的脚本“dev”:“turbo run dev --parallel”在 VSCode 中本地运行。

但是现在我在使用 Docker 容器时遇到了问题。部署作业顺利运行,并创建了映像。但我的 Docker 容器在运行镜像后立即退出。在日志中,我看到此错误:

2024-06-28 10:26:02 node:internal/modules/cjs/loader:1148
2024-06-28 10:26:02   throw err;
2024-06-28 10:26:02   ^
2024-06-28 10:26:02 
2024-06-28 10:26:02 Error: Cannot find module 'next'
2024-06-28 10:26:02 Require stack:
2024-06-28 10:26:02 - /app/apps/web/server.js
2024-06-28 10:26:02     at Module._resolveFilename (node:internal/modules/cjs/loader:1145:15)
2024-06-28 10:26:02     at Module._load (node:internal/modules/cjs/loader:986:27)
2024-06-28 10:26:02     at Module.require (node:internal/modules/cjs/loader:1233:19)
2024-06-28 10:26:02     at require (node:internal/modules/helpers:179:18)
2024-06-28 10:26:02     at Object.<anonymous> (/app/apps/web/server.js:16:1)
2024-06-28 10:26:02     at Module._compile (node:internal/modules/cjs/loader:1358:14)
2024-06-28 10:26:02     at Module._extensions..js (node:internal/modules/cjs/loader:1416:10)
2024-06-28 10:26:02     at Module.load (node:internal/modules/cjs/loader:1208:32)
2024-06-28 10:26:02     at Module._load (node:internal/modules/cjs/loader:1024:12)
2024-06-28 10:26:02     at Function.executeUserEntryPoint [as runMain] (node:internal/modules/run_main:174:12) {
2024-06-28 10:26:02   code: 'MODULE_NOT_FOUND',
2024-06-28 10:26:02   requireStack: [ '/app/apps/web/server.js' ]
2024-06-28 10:26:02 }
2024-06-28 10:26:02 
2024-06-28 10:26:02 Node.js v20.15.0

Dockerfile:

FROM node:20-alpine AS builder

# Set up environment
RUN apk add --no-cache libc6-compat
WORKDIR /app

# Install Corepack and set Yarn version
RUN corepack enable
RUN yarn set version stable

# Install root project dependencies
COPY package.json yarn.lock ./
RUN yarn install

# Copy project files
COPY . .

# Install dependencies
RUN yarn dlx turbo prune --scope=web --docker

# Build the application
RUN yarn dlx turbo run build --filter=web...

# Intermediate stage for installing application dependencies
FROM node:20-alpine AS installer
WORKDIR /app

# Copy necessary files
COPY .gitignore .gitignore
COPY --from=builder /app/out/json/ .
COPY --from=builder /app/out/yarn.lock ./yarn.lock

# Install application dependencies
RUN yarn install

# Copy built artifacts and configuration files
COPY --from=builder /app/out/full/ .
COPY turbo.json turbo.json
RUN yarn dlx turbo run build --filter=web...

# Runner stage
FROM node:20-alpine AS runner
WORKDIR /app

# Set up user permissions
RUN addgroup --system --gid 1001 nodejs
RUN adduser --system --uid 1001 nextjs
USER nextjs

# Copy necessary files from installer stage
COPY --from=installer /app/apps/web/next.config.js .
COPY --from=installer /app/apps/web/package.json .
COPY --from=installer --chown=nextjs:nodejs /app/apps/web/.next/standalone ./
COPY --from=installer --chown=nextjs:nodejs /app/apps/web/public ./apps/web/public
COPY --from=installer --chown=nextjs:nodejs /app/apps/web/.next/static ./apps/web/.next/static

# Expose port and set environment variables
EXPOSE 3000
ENV PORT=3000

# Command to start the application
CMD node apps/web/server.js

最初,我怀疑 AWS ECS 部署存在问题,促使我安装 Docker Desktop。然而,即使在 Docker Desktop 本地,问题仍然存在,这让我相信问题出在 Dockerfile 或项目设置的另一个方面。

我还广泛修改了 Dockerfile 以尝试解决该问题,主要侧重于确保正确的文件夹复制和路径。但这些更改主要导致部署作业彻底失败。

如果相关,现在不要:
在 Docker Desktop 中,在容器的“检查”部分下,我注意到即使在我将其升级到 v4.3.1 之后,它似乎仍然使用 Yarn 版本 1.22.22。这可能是导致问题的原因吗?

任何提示或指导将不胜感激,因为我目前有点困难......

reactjs node.js docker dockerfile next.js14
1个回答
0
投票

这为我解决了这个问题:

在新的 Yarn 版本中,添加了

.yarnrc.yml
,最初只包含一行:
yarnPath: .yarn/releases/yarn-4.3.1.cjs

我必须在这里添加

nodeLinker: node-modules
以确保生成node_modules。

另外,尽管已经读到outputFileTracingRoot设置已经过时并且据说处于不活动状态,但我还必须将这两行保留在我的

next.config.js
中:

output: "standalone",

experimental: { outputFileTracingRoot: path.join(__dirname, "../../") },

如果有人更好地了解这些更改的具体作用以及它们的必要性,请随时发表评论。

© www.soinside.com 2019 - 2024. All rights reserved.