Node のイメージを上げたら、corepack enable の行で CI が止まります。
$ corepack enable
sh: corepack: not found
終了コードは 127(コマンドが見つからないときの値)です。同じ原因で当たる表示ゆれは次のとおりです。
sh: corepack: not found(Alpine の BusyBoxash)sh: 1: corepack: not found(Debian 系のdash)bash: line 1: corepack: command not found(bash)yarn: not found/yarn: command not found(Node 26 のイメージでは Yarn も消えています。後述の二段目)
修正は corepack を npm から入れることです。 corepack enable の前に 1 行足します。
RUN npm install -g corepack@latest && corepack enable
@latest は corepack 自身が案内している入れ方ですが、ビルドの再現性が要るなら版を固定してください。この記事が説明している対応 Node 版や shim の衝突は、latest が別の版へ動けば変わります。
Node 25 のイメージでは、この 1 行がそのままでは通りません(/usr/local/bin/yarn と衝突します)。回避は後述します。Node 26 では衝突しません。
なぜ Node 25 以降で出るのか:配布から外すと決めた
corepack は Node 25.0.0 のリリースノートに載っています(配布の停止が SEMVER-MAJOR、tarball からの削除は Semver-Patch)。
"stop distributing Corepack" (PR #57617)
"remove corepack from release tarballs" (PR #59835)
この PR の本文は、実装の理由を書かずに TSC の投票だけを参照しています(nodejs/TSC#1697)。投票は「Should Corepack stay in the Node.js distribution?」という題で 2025-03-19 に締め切られ、参加率 94.44% で次の選択肢が選ばれました。
Phase out later: stop distributing Corepack (i.e. the distribution will no longer contain a
corepackexecutable) on future (i.e. 25+) release lines of Node.js – existing release lines as well as the very next (i.e. 24.x) will keep it as experimental.
動かなくなったのではなく、配布をやめると決めたものです。 「24.x までは experimental のまま残し、25 以降で外す」という段取りまで選択肢の文面に書いてあります。だから 24 系では今も同梱されていて、上げた瞬間に消えます。
同じコマンドをイメージだけ変えて回した結果です。
| イメージ | node -v | corepack --version |
|---|---|---|
node:24.19.0-alpine | v24.19.0 | 0.35.0 |
node:25.0.0-alpine | v25.0.0 | sh: corepack: not found(127) |
node:26.7.0-alpine | v26.7.0 | sh: corepack: not found(127) |
/usr/local/bin の中身にもそのまま出ます。
$ docker run --rm node:24-alpine sh -c 'ls /usr/local/bin'
corepack docker-entrypoint.sh node nodejs npm npx yarn yarnpkg
$ docker run --rm node:25-alpine sh -c 'ls /usr/local/bin'
docker-entrypoint.sh node nodejs npm npx yarn yarnpkg
タグを変えていなくても 10 月に渡る
2026-08-08 時点のタグの解決先です。
| タグ | 実際の版 | corepack | yarn |
|---|---|---|---|
node:lts / node:24-alpine | v24.19.0 | ある | ある |
node:25-alpine | v25.9.0 | 無い | ある |
node:26-alpine / node:latest | v26.7.0 | 無い | 無い |
node:lts はまだ 24 系を指しています。Node の公式リリース予定表(nodejs/Release の schedule.json)では、26 が LTS になるのは 2026-10-28 の予定です。
前回の昇格では、lts タグは予定日に動きました。Docker 公式イメージのタグ定義(docker-library/official-images の library/node)を辿ると、2025-10-21 時点で lts-alpine は 22.21.0 に付いており、24 が LTS になった 2025-10-28 の更新で 24.11.0 へ移っています。同じことが起きれば、Dockerfile を 1 文字も編集していない CI が、その日に corepack と Yarn を同時に失います。
同じ表から、25 系の位置づけも決まります。
"v25": {"start":"2025-10-15","maintenance":"2026-04-01","end":"2026-06-01"}
Node 25 は 2026-06-01 で終了しています。 25 で踏んだ場合、corepack を入れ直すより 24 系(LTS)か 26 系へ移るほうが先です。
corepack と Yarn は、別々の場所から別々の版で消えた
Node 25 のイメージには Yarn 1.x の shim が残っていました。26 のイメージからは、これも外れています。
$ docker run --rm node:25-alpine sh -c 'yarn --version'
1.22.22
$ docker run --rm node:26-alpine sh -c 'yarn --version'
sh: yarn: not found
corepack と Yarn では、消えた場所が違います。corepack は Node の配布物から外れたもの、Yarn 1.x は Docker 公式イメージ側が同梱をやめたものです(nodejs/docker-node#2407「Prepare Yarn v1 removal in Node.js 26 images」。同 issue は TSC endorsed the removal of Yarn v1 for images based on Node.js 26 and above と書いています)。イメージを使う側から見ると、node:lts が 26 へ動く 10 月に両方が同時に効き始めます。
yarn しか使っていないプロジェクトでも、直し方は同じ形になります。
RUN npm install -g [email protected]
Node 25 では修正の 1 行が衝突する
npm install -g corepack@latest を Node 25 のイメージで実行すると、インストールの段で止まります。
$ npm install -g corepack@latest
npm warn EBADENGINE Unsupported engine {
npm warn EBADENGINE package: '[email protected]',
npm warn EBADENGINE required: { node: '^22.22.2 || ^24.15.0 || >=26.0.0' },
npm warn EBADENGINE current: { node: 'v25.9.0', npm: '11.12.1' }
npm warn EBADENGINE }
npm error code EEXIST
npm error path /usr/local/bin/yarn
npm error EEXIST: file already exists
npm error File exists: /usr/local/bin/yarn
corepack のパッケージは、corepack のほかに yarn / yarnpkg / pnpm / pnpx の shim を置きます。25 のイメージにはまだ Yarn 1.x の shim があるので、/usr/local/bin/yarn を取り合います。26 でこの 1 行が通るのは、Yarn の shim が先に消えていて、置く先が空いているからです。
24 系(今日の node:lts)では衝突しません。corepack が /usr/local/lib/node_modules/corepack に npm のパッケージとして入っているので、npm install -g corepack@latest はそれを更新する形になります。衝突するのは 25 だけ——corepack のパッケージだけが消えて、Yarn の shim が残った版です。
この機構の帰結として、26 で修正を当てた環境にも yarn コマンドが生えます(corepack の shim として)。叩くと corepack がレジストリから Yarn を取りに行きます。
回避は 2 つあり、どちらも pnpm --version まで到達します。どちらもイメージのビルド中に、そのイメージの中で実行する前提です(Dockerfile の RUN 行)。actions/setup-node などでランナーに入っている Node を使っている場合、/usr/local/bin/yarn はそのマシンに入っている Yarn の実体なので、同じコマンドを打たないでください。セルフホストのランナーなら、消えたぶんは次のジョブ以降も戻りません。
# 1. 先に Yarn 1.x の shim を外す(何が消えるかがコマンドに出る)
RUN rm -f /usr/local/bin/yarn /usr/local/bin/yarnpkg \
&& npm install -g corepack@latest && corepack enable
# 2. 上書きを許可する
RUN npm install -g --force corepack@latest && corepack enable
素の node:25 イメージで 2 を実行すると、上書きされるのは Yarn 1.x の shim(/usr/local/bin/yarn と yarnpkg)です。ただし --force は衝突したものを種類を問わず上書きします。この行より前に自分でグローバルインストールしているものがあれば、そちらも対象になります。上書き後に yarn を叩くと、corepack の shim が応答します。
$ yarn --version
This project is configured to use pnpm because /app/package.json has a "packageManager" field
packageManager に yarn を書いているプロジェクトでは、yarn を叩くと corepack がその版を解決します。ただし corepack はレジストリから取得するので、ネットワークを遮断したビルド段では実体が無い状態になります(イメージに焼かれていた Yarn 1.x は消えているため)。yarn を Yarn 1.x として別に使っている場合も、上書きされた側が消えます。
上の警告のとおり、corepack 0.35.0 は engines から Node 25 を外しています(0.34.3 から 0.34.7 は ^20.10.0 || ^22.11.0 || >=24.0.0 で、25 が入っていました)。npm は警告だけ出してインストールし、corepack enable も pnpm --version も通ります。ただし 25 は既に終了した系列なので、ここに時間を使うより 24 か 26 へ移すほうが短く済みます。
corepack を経由しない直し方
packageManager フィールドの解決を諦めて、パッケージマネージャを直接入れる手もあります。
RUN npm install -g [email protected]
版を書くときは、packageManager に合わせるだけでなく現行の保守版かどうかを見てください。pnpm 10 系の 10.19.0 には、公開済みの脆弱性勧告が複数あります(GHSA-qrv3-253h-g69c ほか。修正は 11.7.0 / 11.8.0 で入っています)。ここで 11.20.0 を書いているのはそのためです。
これは Node 25 でも 26 でも 1 行で通ります。代わりに、使う版の指定が package.json の packageManager と Dockerfile の 2 箇所に分かれます。片方だけ上げても誰も止めないので、上げ忘れると手元と CI で別の pnpm が動きます。packageManager を版の正本として使い続けるなら、corepack を入れる側を選んでください。
効かない直し方
npx から呼ぶ形は、終了コード 0 で成功したように見えて何も残りません。
$ npx -y corepack@latest enable
(rc=0 で終わる)
$ pnpm --version
sh: pnpm: not found
corepack enable は shim を作りますが、npx が corepack 自体を一時的な場所へ置くので、作られた shim も PATH に残りません。エラーを出さずに終わるので、CI のログでは成功した行に見えます。
切り分け
yarn: not foundのほうが出ている:Node 26 のイメージです。corepack ではなく Docker 公式イメージ側から Yarn 1.x が外れています。npm install -g [email protected]か、corepack を入れてpackageManagerに解決させてください。corepack enableは通るのにpnpm: not foundになる:npx corepackで呼んでいます。上の「効かない直し方」を見てください。npm error code EEXIST/path /usr/local/bin/yarnで止まる:Node 25 のイメージです。Yarn 1.x の shim と衝突しています。Cannot find matching keyidが出る:corepack がパッケージマネージャを取得するときの署名検証で落ちています。packageManagerに書いた版を新しくするか、その版をnpm install -gで直接入れてください(この経路は実測していません)。- 手元では動くのに CI だけ落ちる:
node -vを CI のログに出してください。手元が 24 系、CI がnode:latest(26 系)という食い違いがよく残ります。 corepackは入ったがpackageManagerの版が取得できない:corepack はレジストリからパッケージマネージャを落とすので、ネットワークが遮断されたビルド段では失敗します。corepack enableではなく、必要な版を含むイメージを用意してください。
検証環境
node:26.7.0-alpine、package.jsonに"packageManager": "[email protected]"- 再現:
corepack enable && pnpm --versionがsh: corepack: not foundを出して終了コード 127(ネットワーク遮断のまま。レジストリに届かないことが理由ではありません) - 修正:同じイメージ・同じコマンドのまま
npm install -g corepack@latestを先に走らせると終了コード 0
再現から修正までは errfix の検証ハーネスが機械的に確認しています。版の対照(24.19.0 に corepack 0.35.0 があり、25.0.0 / 25.9.0 / 26.7.0 では 127)、/usr/local/bin の中身、Yarn が 25 まで残り 26 で消えること、Node 25 で npm install -g corepack@latest が EEXIST になり 24 では通ること、24 にだけ /usr/local/lib/node_modules/corepack があること、--force と shim 削除の 2 つの回避がどちらも pnpm --version を通すこと、--force の後に yarn を叩くと corepack の shim が応答すること、26 で修正を当てると yarn / pnpm の shim が生えること、npx -y corepack@latest enable が終了コード 0 のまま pnpm を残さないこと、npm install -g [email protected] が単独で通ることは、いずれも同じ手順で実測しています。
配布から外れた経緯は Node 25.0.0 のリリースノートと nodejs/TSC#1697 の開票結果、LTS の予定日は nodejs/Release の schedule.json、corepack の engines は npm レジストリのメタデータ、pnpm の勧告は GitHub Advisory Database によります。lts タグが前回の昇格日に 22 から 24 へ動いたことは docker-library/official-images のコミット履歴で確認しました。
2026-10-28 に lts が 26 へ動くかどうかは、前回と同じことが起きるという予測です(予定日そのものは一次情報にありますが、タグが動く保証ではありません)。
Cannot find matching keyid は実測していません(切り分け節の該当項目はそう明記しています)。Yarn 1.x がイメージから外れた経緯は nodejs/docker-node#2407 の記述によります。