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