pnpm v10→v11アップグレードで踏んだ3つの落とし穴 ─ Docker・CI環境での対処法まとめ

pnpm v10→v11アップグレードで踏んだ3つの落とし穴 ─ Docker・CI環境での対処法まとめ

pnpm v10からv11へのアップグレードで、Docker・CI環境が壊れた実体験をもとに、allowBuildsの設定、Dockerfileへのpnpm-workspace.yaml追加、ENV CI=trueの3つの対処法を解説します。
2026.05.29

はじめに

pnpm v11がリリースされ、プロジェクトのパッケージマネージャーをv10からアップグレードしました。ローカル環境では比較的スムーズでしたが、DockerビルドとCIパイプラインが盛大に壊れました

本記事では、実際にハマったポイントと対処法を「やってみた」形式で共有します。正直なところ、pnpm v11の破壊的変更はかなり多く、公式ドキュメントを読んでも見落としやすい罠がいくつかありました。

前提・環境

  • pnpm: v10.32.1 → v11(latest)
  • Node.js: 24(LTS)
  • フレームワーク: Next.js 16
  • Docker: node:24-slim ベースイメージ
  • CI: GitHub Actions

pnpm v11の主な破壊的変更

アップグレード前に知っておくべき主要な変更点を整理します。

1. postinstallスクリプトがデフォルトでブロックされる

これが最大の罠でした。 v10まではpostinstallスクリプト(ネイティブモジュールのビルドなど)は警告付きで実行されていましたが、v11では明示的に許可しないとエラーになります。

 ERR_PNPM_IGNORED_BUILDS  The following dependencies have build scripts that are not executed: sharp, unrs-resolver

2. 設定ファイルの場所が変わった

.npmrc に書いていたpnpm固有の設定(hoist-pattern, node-linker, save-exact など)は、v11では読み込まれませんpnpm-workspace.yaml に移行する必要があります。

設定の種類 v10 v11
レジストリ・認証 .npmrc .npmrc(変更なし)
pnpm固有設定 .npmrc pnpm-workspace.yaml
package.json#pnpm 読み込まれる 無視される

3. 環境変数のプレフィックスが変わった

npm_config_*pnpm_config_* に変更。CI環境やDockerfileで npm_config_* を使っている場合は要修正。

4. Node.js 22以上が必須

Node.js 18〜21のサポートが切られました。

実際にハマった3つの落とし穴

落とし穴1: allowBuilds でpostinstallスクリプトを許可する

pnpm install を実行すると、sharp(画像処理)や unrs-resolver(ESLint用)など、ネイティブビルドが必要なパッケージでエラーが出ます。

対処法: pnpm-workspace.yamlallowBuilds を追加します。

# frontend/pnpm-workspace.yaml
allowBuilds:
  sharp: true
  unrs-resolver: true

プロジェクトルートにも別のパッケージ用に必要でした:

# pnpm-workspace.yaml(ルート)
allowBuilds:
  cpu-features: true
  ssh2: true

ポイント: どのパッケージが引っかかるかは pnpm install のエラーメッセージを見ればわかります。エラーに表示されたパッケージ名を allowBuilds に追加していけばOKです。

v10までの onlyBuiltDependencies / neverBuiltDependencies / ignoredBuiltDependencies は廃止されているので、既にこれらを使っている場合は allowBuilds に書き換える必要があります。

落とし穴2: Dockerfileで pnpm-workspace.yaml をCOPYし忘れる

pnpm-workspace.yaml は v11 で必須の設定ファイルになりました。しかし、既存のDockerfileでは package.jsonpnpm-lock.yaml しかCOPYしていませんでした。

Before(壊れる):

COPY frontend/package.json frontend/pnpm-lock.yaml ./
RUN pnpm install --frozen-lockfile

After(動く):

COPY frontend/package.json frontend/pnpm-lock.yaml frontend/pnpm-workspace.yaml ./
RUN pnpm install --frozen-lockfile

pnpm-workspace.yaml がないと allowBuilds の設定が読み込まれず、postinstallスクリプトがブロックされてDockerビルドが失敗します。

落とし穴3: Docker内で ENV CI=true が必要

上記2つを修正しても、Docker内の pnpm install がまだ失敗するケースがありました。

原因は、pnpm v11が未許可のpostinstallスクリプトを検出したとき、対話的に許可するかどうかをプロンプトで聞いてくる仕様になったことです。Dockerビルド中はTTYがないので、このプロンプトがハングまたはエラーになります。

対処法: ENV CI=true を設定すると、pnpmは非対話モードになり、プロンプトを出さずに allowBuilds の設定に従って動作します。

FROM node:24-slim
ENV CI=true
RUN corepack enable && corepack prepare pnpm@latest --activate

WORKDIR /app

COPY frontend/package.json frontend/pnpm-lock.yaml frontend/pnpm-workspace.yaml ./
RUN pnpm install --frozen-lockfile

ENV CI=true の1行を足すだけですが、これがないとDockerビルドが黙って止まるため、原因の特定に時間がかかりました。

CI(GitHub Actions)の修正

GitHub Actionsでは pnpm/action-setup のバージョン指定も更新が必要でした。

# Before
- uses: pnpm/action-setup@v4
  with:
    version: 10

# After
- uses: pnpm/action-setup@v4
  with:
    version: latest

GitHub Actions環境では CI=true がデフォルトで設定されているため、Docker内のような追加対処は不要でした。ただし、pnpm-workspace.yaml が正しくリポジトリにコミットされていないと、CI上でも同じ ERR_PNPM_IGNORED_BUILDS エラーが出ます。

正直な感想

pnpm v11のアップグレードは、率直に言ってめんどくさかったです。

良い点:

  • allowBuilds によるpostinstallスクリプトの明示的許可は、サプライチェーン攻撃への防御としてセキュリティ面では正しい方向性
  • minimumReleaseAge(公開から24時間未満のパッケージを解決しない)のデフォルト有効化も同様に良い判断
  • 設定が pnpm-workspace.yaml に一元化されるのは長期的にはわかりやすい

辛い点:

  • 「警告→エラー」の変更はユーザーにとって最もインパクトが大きい破壊的変更で、特にCI/Dockerのような非対話環境で初めて気づく
  • pnpm-workspace.yaml をDockerfileにCOPYする必要があることは、公式ドキュメントのDocker向けガイドでもっと目立つように書いてほしかった
  • ENV CI=true が必要なことはどこにも明記されておらず、試行錯誤で発見するしかなかった
  • 破壊的変更の数が多すぎて、公式マイグレーションガイドを読んでも全部を一度に把握するのは難しい

結局のところ、pnpm v11はセキュリティファーストの設計思想への大きな転換です。allowBuilds のデフォルト拒否、minimumReleaseAgeblockExoticSubdeps など、どれも「安全側に倒す」変更です。方向性は正しいと思いますが、移行コストはそれなりにあります。

アップグレード手順のまとめ

  1. pnpx codemod run pnpm-v10-to-v11 を実行して機械的な設定移行を行う
  2. pnpm install を実行して ERR_PNPM_IGNORED_BUILDS エラーに出るパッケージ名を確認
  3. pnpm-workspace.yamlallowBuilds を追加
  4. Dockerfilepnpm-workspace.yaml のCOPYを追加
  5. DockerfileENV CI=true を追加
  6. CI設定(GitHub Actions等)のpnpmバージョンを更新
  7. .npmrc のpnpm固有設定を pnpm-workspace.yaml に移行
  8. lockfileを再生成pnpm install で自動更新)

参考リンク

この記事をシェアする

関連記事