我目前正在开发一个 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。这可能是导致问题的原因吗?
任何提示或指导将不胜感激,因为我目前有点困难......
这为我解决了这个问题:
在新的 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, "../../") },
如果有人更好地了解这些更改的具体作用以及它们的必要性,请随时发表评论。