DockerfileテンプレートのYarnインストールコマンドをCorepack対応に更新
Dockerfile.tt テンプレートの yarn install コマンドが、Corepack経由かどうかに応じて適切なフラグを自動選択するよう更新されました。これにより、異なるYarn管理方式を採用するプロジェクト間での互換性が向上します。
背景
Yarnには2系統のバージョンがあり、それぞれロックファイルを強制するフラグの名称が異なります。Yarn Classic(v1) は --frozen-lockfile フラグを使用しますが、Yarn Berry(v2以降) では --immutable フラグが正式なオプションとして採用されており、--frozen-lockfile は認識されません。Corepack経由で管理されるYarnは通常Berry系であるため、両方の環境に対応するには分岐が必要でした。
変更前のテンプレートは --immutable を無条件に使用していたため、Corepackを使わずYarn Classicを利用するプロジェクトでは yarn install --immutable が未知のフラグとしてエラーになる可能性がありました。この問題がCorepack使用有無による条件分岐の導入につながっています。
技術的な変更
railties/lib/rails/generators/rails/app/templates/Dockerfile.tt の yarn install 行が、ERBテンプレートの条件式を用いた動的なフラグ選択に変更されました。
変更前:
RUN yarn install --immutable
変更後:
RUN yarn install --<%= yarn_through_corepack? ? "immutable" : "frozen-lockfile" %>
yarn_through_corepack? ヘルパーメソッドの返り値に応じて、Corepack管理下では --immutable、それ以外では --frozen-lockfile が出力されます。生成されるDockerfileの行はどちらの場合も単一のフラグを持つシンプルな形式になります。
設計判断
既存の yarn_through_corepack? ヘルパーを活用する方式 が採用されました。新たな設定キーや環境変数を導入せず、すでにジェネレータ内で使われているヘルパーメソッドに判断を委ねることで、変更を1行に最小化しています。テンプレート自体にロジックを埋め込む形ですが、条件の意味がフラグ名と直結しており可読性は維持されています。
ロックファイルの整合性を強制するフラグを環境に応じて切り替えることで、CI/CDパイプラインでの予期しないパッケージ更新を防ぐ安全策が、より広い環境で機能するようになります。
まとめ
1行のテンプレート変更でありながら、Yarn管理方式の違いによるDockerビルドの失敗を防ぐ実用的な修正です。yarn_through_corepack? という既存の抽象化を活かした判断は、テンプレートの複雑さを増やさずに互換性を広げるアプローチとして参考になります。