Next.js + pnpm Docker 构建问题
1. 问题现象
在 Docker 构建过程中,执行:
RUN npm install -g pnpm@10.11.1
时报错:
npm error EEXIST: file already exists
npm error File exists: /usr/local/bin/pnpm
2. 问题原因
- 基础镜像
node:22-alpine3.21
已经自带了pnpm
。 corepack enable
会在/usr/local/bin/
下生成 pnpm 的 shim 文件。- 再执行
npm install -g pnpm@xxx
时会和已存在的/usr/local/bin/pnpm
冲突,导致EEXIST
。
3. 解决方案
✅ 推荐做法(官方推荐方式)
-
删除
npm install -g pnpm@xxx
。 -
使用 corepack 管理 pnpm 版本:
-
在
package.json
里指定:{ "packageManager": "pnpm@10.11.1" }
-
Dockerfile 示例:
RUN corepack enable COPY package.json pnpm-lock.yaml ./ RUN corepack install RUN pnpm install --frozen-lockfile
-
🔧 其他可选方式
-
强制覆盖安装
RUN npm install -g pnpm@10.11.1 --force
-
先卸载再安装
RUN npm uninstall -g pnpm && npm install -g pnpm@10.11.1
4. 当前 Dockerfile 改进
在你的 Dockerfile 中:
RUN corepack enable
# ...
RUN corepack install
RUN pnpm install --frozen-lockfile
已经不再显式安装 pnpm,避免了冲突。
只要在 package.json
里声明 packageManager: "pnpm@10.11.1"
,就能保证构建时使用正确版本。
📌 记忆要点
- Node 18+ 默认带 corepack。
- corepack + package.json 管理 pnpm 版本,推荐用这种方式。
- 避免重复
npm install -g pnpm
,否则容易EEXIST
。