feat(container): npm グローバルを ubuntu ユーザで更新可能にし、ベースを Ubuntu 26.04 LTS へ更新する - #117
Conversation
…更新する npm のグローバル prefix が既定の /usr (root 所有) だったため、ubuntu ユーザでの `npm i -g` が EACCES で失敗し、codex などの自動バージョンアップが行えなかった。 - npm グローバル prefix を /usr/local/share/npm-global へ移し、ENV で全シェルに効かせる (置き場所とパーミッション設計は Dev Containers 標準に合わせた) - npm グループ + setgid + umask 0002 で、UID/GID を振り直しても壊れない形にする - trygroup / bi-tools の `npm i -g` を root から ubuntu 実行へ変更する (root で入れると root 所有ファイルが混ざり ubuntu が更新できなくなるため) - lfm へ NPM_CONFIG_PREFIX / PATH を追加する (副次的に、これまで欠けていた codex・gemini・yarn・tsc の実行ファイルも通るようになる) - ベースイメージを ubuntu:noble (24.04) から ubuntu:26.04 LTS へ更新する (最新 LTS。system python が 3.12 から 3.14 になる) Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01EwCPSHW7XBt9zbFi6opWBg
takemi-ohama
left a comment
There was a problem hiding this comment.
🤖 cross-review | round 1 | codex | APPROVE
修正が必要な指摘はありません。
takemi-ohama
left a comment
There was a problem hiding this comment.
🤖 cross-review | round 1 | gemini | REQUEST_CHANGES
- base イメージの Dockerfile において、npm パッケージのインストールと、ディレクトリの所有者・権限変更が別々の RUN レイヤーで行われているため、数百MBのファイル群が不要にコピーされイメージサイズが肥大化します。
- lfm イメージにおいて、base から COPY した
/usr/local以下のnpmグループが lfm 側で未定義のため、setgid の効果が意図通りに働かない恐れがあります。
cross-review (gemini, round 1) の指摘 2 件へ対応。 - containers/base/Dockerfile: ユーザー/グループ作成を npm install レイヤーより 前へ移し、chown -R / chmod -R / setgid を npm install と同じ RUN 内で実施する。 従来は別レイヤーで chown -R していたため、数百MBの node_modules が メタデータ変更だけのために新レイヤーへ丸ごと複製されていた。 あわせて prefix ディレクトリを install -d -m 2775 -o ubuntu -g npm で作る。 - containers/base/Dockerfile: npm グループの GID を ARG NPM_GID=2000 で固定する。 派生イメージ (lfm) と GID を揃えるため。 - containers/lfm/Dockerfile: base と同じ GID で npm グループを作り、 ubuntu を所属させる。base から COPY した /usr/local 配下のファイルは GID 数値しか保持しないため、グループ定義が無いと GID が未定義になり setgid が効かず sudo なしの `npm i -g` ができなかった。 lfm 側で chown -R はしない(同じレイヤー肥大を招くため)。 Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01EwCPSHW7XBt9zbFi6opWBg
🔧 cross-review fix | round 1対応コミット: 対応件数
重要度別(AI の付与ラベルをコードを読んで再判定した結果、いずれも major で妥当と判断):
対応内容
実ビルド検証 (linux/arm64, Docker Desktop)
検証用の一時イメージ ( CI 状態修正前スナップショット時点で全 5 チェック SUCCESS(Python syntax check 3.10/3.11/3.12、Ruff lint、ShellCheck)。今回の変更は Dockerfile のみのため影響なしと判断(再実行は待っていません)。 |
takemi-ohama
left a comment
There was a problem hiding this comment.
🤖 cross-review | round 2 | codex | APPROVE
修正が必要な指摘はありません。
takemi-ohama
left a comment
There was a problem hiding this comment.
🤖 cross-review | round 2 | gemini | REQUEST_CHANGES
- OSバージョンの不整合 (glibc リスク):
containers/base/Dockerfileで Ubuntu 26.04 にアップグレードしていますが、containers/lfm/Dockerfile側は Ubuntu 24.04 ベースのままです。lfmはdevbase-baseからnode等のバイナリを COPY しているため、新しい OS 向けのバイナリを古い OS に持ち込むことになり、将来的にglibcなどの共有ライブラリ不整合によるクラッシュを引き起こすリスクがあります。ベース OS を統一するか、依存関係のコピー方法を見直してください。
takemi-ohama
left a comment
There was a problem hiding this comment.
🤖 cross-review | round 2 | gemini | REQUEST_CHANGES
Ubuntu 26.04 への更新に際し、いくつか見落としによるビルド・実行障害のリスクがあります。詳細はインラインコメントに記載しましたが、主に devbase-php の標準パッケージ依存と、devbase-lfm における新しい glibc バイナリの旧 OS へのコピーについて確認・対応をお願いします。
- containers/php: php8.3-* → php8.5-*(26.04 標準リポジトリに php8.3 は無く php8.5 8.5.4 がある)
- containers/php85: ondrej PPA が resolute 未対応 (dists/resolute が 404) のため標準リポジトリ利用へ切り替え
- containers/snapshot: FROM ubuntu:noble → ubuntu:26.04
- docs/developer/{extending,contributing}.md: ubuntu:noble 表記を ubuntu:26.04 へ更新
- containers/lfm: base(26.04/glibc 2.43) と lfm(CUDA 12.6.3-ubuntu24.04/glibc 2.39) の
既知の非互換と、解消に CUDA 13.3.1-ubuntu26.04 への更新が必要である旨をコメントで明記
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01EwCPSHW7XBt9zbFi6opWBg
🔧 cross-review fix | round 2対応コミット: 対応件数
重要度別(AI 付与ラベルをコード・実測で再判定した結果、いずれも妥当と判断):
対応内容
事実確認(実測)
実ビルド検証 (linux/arm64, Docker Desktop)
検証用の一時イメージ ( PR 本文の更新「やらないこと / フォローアップ」節を新設し、(1) lfm の CUDA/glibc 非互換、(2) php と php85 がほぼ同一内容になったことの統廃合、を記載しました。あわせて変更点・確認事項・動作確認へ php 8.5 化と各ビルド結果を反映しています。 CI 状態修正前スナップショット時点で全 5 チェック SUCCESS(Python syntax check 3.10/3.11/3.12、Ruff lint、ShellCheck)。今回の変更は Dockerfile と Markdown のみのため影響なしと判断(再実行は待っていません)。 |
takemi-ohama
left a comment
There was a problem hiding this comment.
🤖 cross-review | round 3 | codex | REQUEST_CHANGES
docs/developer/extending.md:247、docs/plugin-dev/compose-yml-guidelines.md:155、docs/plugin-dev/quickstart.md:336、docs/user/container-operations.md:219 が引き続き php イメージを PHP 8.3 と案内しています。PHP 8.5 への仕様変更に合わせ、利用者が誤ったランタイム前提で選択しないよう関連文書を一括更新してください。
takemi-ohama
left a comment
There was a problem hiding this comment.
🤖 cross-review | round 3 | gemini | COMMENT
本 PR の主目的である npm グローバルの非 root 化、ベースイメージの Ubuntu 26.04 LTS 更新、およびレイヤー肥大化や lfm での GID 整合などの細かな課題は非常に適切に解決されています。
ドキュメントの一部に、以前のバージョン表記(Ubuntu Noble / PHP 8.3)が残っている箇所があります。整合性を保つため、以下のファイルの表記も本 PR の変更に合わせて更新することをお勧めします(差分外のファイルを含むため、全体コメントとして記載します)。
docs/developer/extending.md: 247行目の Mermaid 図内のPHP 8.3をPHP 8.5に更新docs/user/container-operations.md:Ubuntu Noble,PHP 8.3の表記(複数箇所)docs/plugin-dev/quickstart.md:Ubuntu Noble,PHP 8.3の表記docs/plugin-dev/compose-yml-guidelines.md:Ubuntu Noble,PHP 8.3の表記
devbase-base が ubuntu:26.04 (glibc 2.43) になったことで、 nvidia/cuda:12.6.3-cudnn-devel-ubuntu24.04 (glibc 2.39) ベースだった lfm では COPY --from で持ち込まれる node / gh 等が動かず、直後の確認 RUN でビルド自体が 失敗する状態だった。cudabase を nvidia/cuda:13.3.1-cudnn-devel-ubuntu26.04 へ 更新して glibc を整合させる(nvidia/cuda の ubuntu26.04 タグは CUDA 13.3.1 系のみ)。 あわせて docs に残っていた Ubuntu Noble / PHP 8.3 の表記を 26.04 / 8.5 へ更新する。 Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01EwCPSHW7XBt9zbFi6opWBg
🔧 cross-review fix | round 3対応コミット: 対応件数
重要度別(AI 付与ラベルをコード・実測で再判定した結果、いずれも妥当と判断):
あわせて round 2 で deferred としていた lfm 関連 2 スレッド( 対応内容1.
|
| 項目 | before | after |
|---|---|---|
cudabase の FROM |
nvidia/cuda:12.6.3-cudnn-devel-ubuntu24.04 |
nvidia/cuda:13.3.1-cudnn-devel-ubuntu26.04 |
| glibc | 2.39(base 2.43 と不一致) | 2.43(base と一致) |
| CUDA / cuDNN | 12.6.3 / cuDNN 9 | 13.3 (V13.3.73) / 9.24.0 |
round 2 で追加した「既知の非互換 / 未解消」コメントは実態に合わなくなったため削除し、「cudabase の Ubuntu は devbase-base と必ず一致させること・nvidia/cuda の ubuntu26.04 タグは CUDA 13.3.1 系のみ」という再発防止の注意書きへ置き換えました。
2. ドキュメントの版数表記 — minor / 保守性(codex round 3 body + gemini round 3 body)
差分外ファイルのため inline スレッドがありません。grep -rn "Noble\|noble\|PHP 8\.3\|php8\.3" docs/ で洗い出し、本 PR の変更で実際に古くなった記述のみを更新しました(計 10 箇所)。
| ファイル | 変更 |
|---|---|
docs/developer/extending.md |
mermaid 図 devbase-php<br/>PHP 8.3, Composer → PHP 8.5, Composer(247 行目) |
docs/user/container-operations.md |
mermaid 図 A[Ubuntu Noble] → A[Ubuntu 26.04]、表の base / snapshot のベース Ubuntu Noble → Ubuntu 26.04、php 行 PHP 8.3、Composer、MySQL Shell / PHP 8.3 系 開発 → PHP 8.5 … |
docs/plugin-dev/quickstart.md |
表の base / snapshot の Ubuntu Noble → Ubuntu 26.04、php 行 PHP 8.3 → PHP 8.5 |
docs/plugin-dev/compose-yml-guidelines.md |
同上 |
修正後に再 grep して Noble / PHP 8.3 / php8.3 の残存が 0 件であることを確認しています。
なお、同じ表にある Node.js 20(実際は 24.20.0)や lfm のベース欄 general(実際は nvidia/cuda)は本 PR の変更で古くなったものではない既存の齟齬のため、スコープ外として今回は触っていません。containers/lfm に CUDA バージョンを記載している docs は存在しませんでした(grep -rn "CUDA\|cuda\|12\.6" docs/ で確認)。
実ビルド検証 (linux/arm64, Docker Desktop, GPU なし)
docker buildx build --load -t devbase-lfm:crossfix containers/lfm → ✅ 成功 (exit 0)
| 確認項目 | 結果 |
|---|---|
/etc/os-release |
✅ Ubuntu 26.04 LTS |
ldd --version |
✅ GLIBC 2.43-2ubuntu2.3(devbase-base と一致) |
nvcc --version |
✅ release 13.3, V13.3.73 |
| cuDNN | ✅ libcudnn.so.9.24.0 |
node / npm |
✅ v24.20.0 / 11.19.0 |
gh / aws / gcloud |
✅ 2.98.0 / aws-cli/2.36.33 Python/3.14.6 exe/aarch64.ubuntu.26 / Google Cloud SDK 582.0.0 |
npm config get prefix |
✅ /usr/local/share/npm-global |
id ubuntu |
✅ ...,996(docker),2000(npm)(npm グループが GID 2000 で解決) |
ls -ld prefix |
✅ drwxrwsr-x ubuntu npm(setgid 有効) |
ubuntu で sudo なし npm i -g cowsay@1.6.0 |
✅ 成功 → ubuntu:npm / 2755 |
codex / gemini / yarn / tsc / playwright |
✅ すべて /usr/local/share/npm-global/bin/ で解決 |
| その他ツール | ✅ rustc 1.98.0 / mecab 0.996 / gfortran 15.2.0 / docker 29.7.2 / terraform 1.16.0 / google-chrome 152.0.7977.64 / playwright 1.62.1(chromium 導入済み) |
| イメージサイズ | 24.1GB |
CUDA 13.3 / resolute でのパッケージ名変更の有無: apt 追加パッケージはすべてそのまま解決でき、Dockerfile の書き換えは不要でした。外部 apt リポジトリの resolute / arm64 対応も実測で確認済みです。
| リポジトリ | 結果 |
|---|---|
Docker CE dists/resolute/Release |
✅ 200 |
HashiCorp dists/resolute/Release |
✅ 200 |
Google Chrome dists/stable |
✅ 200 / Architectures: amd64 arm64(binary-arm64 あり) |
NVIDIA Container Toolkit stable/deb/$(ARCH) |
✅ stable/deb/arm64 の Packages 取得成功 |
nvidia/cuda の ubuntu26.04 タグ |
✅ 13.3.1-{base,runtime,devel,cudnn-runtime,cudnn-devel}-ubuntu26.04 / 13.3.0-* の 8 件が存在(Docker Hub tags API) |
未実施: GPU 実機での CUDA 13.3 動作確認(本環境に GPU が無いため)。PR 本文の「動作確認」に未チェック項目として残しています。
検証用の一時イメージ (devbase-lfm:crossfix) は削除済みです。devbase-base:latest / devbase-base:noble-backup は変更していません。
PR 本文の更新
- 「変更点」: lfm のコメント追記 → CUDA 13.3.1 / ubuntu26.04 化へ書き換え。docs 版数追随の項目を追加
- 「動作確認」:
devbase-lfmを 未ビルド → ビルド成功(上記検証結果つき)へ更新。GPU 実機確認を未チェック項目として追加 - 「やらないこと / フォローアップ」: 項目 1 を「lfm の glibc 非互換(未解消)」→「GPU ライブラリの CUDA 13.x 追随」へ書き換え(OS/glibc 側は解消済み、PyTorch 等は cu13x 対応ビルドが必要な旨を明記)
CI 状態
修正前スナップショット時点で全 5 チェック SUCCESS(Python syntax check 3.10/3.11/3.12、Ruff lint、ShellCheck)。今回の変更は Dockerfile と Markdown のみのため影響なしと判断(再実行は待っていません)。
takemi-ohama
left a comment
There was a problem hiding this comment.
🤖 cross-review | round 4 | codex | APPROVE
修正が必要な指摘はありません。
takemi-ohama
left a comment
There was a problem hiding this comment.
🤖 cross-review | round 4 | gemini | APPROVE
変更内容は適切です。base イメージの 26.04 移行、npm グローバルインストールの権限整理(Dev Containers 方式への準拠と setgid の活用)、および PHP の標準リポジトリ移行など、いずれも既存の仕組みと矛盾なく安全に実装されていることを確認しました。問題ありません。
概要
npm のグローバル prefix が既定の
/usr(/usr/lib/node_modules+/usr/bin、root 所有)だったため、ubuntuユーザでのnpm i -gが EACCES で失敗し、codex などの自動バージョンアップが実行できなかった。グローバル領域を非 root で更新できる場所へ移し、あわせて調査の結果ベースイメージが最新 LTS でなくなっていたため Ubuntu 26.04 LTS へ更新する。
配置は Dev Containers 標準(
devcontainers/imagesの javascript-node)に合わせた。$HOME配下ではなく共有ディレクトリを選んだ理由は、ENVに~が展開できず絶対パス直書きになるため、docker exec -u rootや派生 Dockerfile の root 実行が ubuntu の$HOMEに root 所有ファイルを作り、同じ障害を再発させるため。関連 Issue
変更点
/usr/local/share/npm-globalへ移動。ENV NPM_CONFIG_PREFIX+ENV PATHなのでdocker execなどの非対話実行でも有効npmグループ +chown ubuntu:npm+setgid+umask 0002。UID/GID を振り直しても壊れない形にするtrygroup(pnpm)/bi-tools(@lightdash/cli)のnpm i -gをUSER rootからUSER ubuntuへ変更。root で入れると root 所有ファイルが混ざり ubuntu が更新できなくなるためlfmにNPM_CONFIG_PREFIX/PATHを追加。COPY --from /usr/localで取り込まれるため追加 COPY は不要。副次的に、これまで lfm に無かった codex・gemini・yarn・tsc の実行ファイルも解決されるようになるubuntu:noble(24.04)からubuntu:26.04LTS(Resolute Raccoon、2026-04 リリース / サポート 2031-04 まで / 26.04.1 は 2026-08-27 リリース済み)へ更新containers/phpの PHP を 8.3 → 8.5 へ更新。26.04(resolute)の標準リポジトリにphp8.3-*は存在せず(apt-cache search '^php8.3'が 0 件)、php8.5-*8.5.4 が提供されるため。PPA は追加していないcontainers/php85からppa:ondrej/phpの追加を削除し標準リポジトリ利用へ。ondrej PPA は resolute 向け dist を公開しておらず(dists/resolute/Releaseが 404)、そのままではapt-get updateでビルドが壊れるためcontainers/snapshotのベースをubuntu:noble→ubuntu:26.04へ。docs/developer/{extending,contributing}.mdのubuntu:noble表記も追随docs/user/container-operations.md/docs/plugin-dev/quickstart.md/docs/plugin-dev/compose-yml-guidelines.md/docs/developer/extending.mdのUbuntu Noble→Ubuntu 26.04、phpイメージのPHP 8.3→PHP 8.5containers/lfmのベース (cudabase) をnvidia/cuda:12.6.3-cudnn-devel-ubuntu24.04→nvidia/cuda:13.3.1-cudnn-devel-ubuntu26.04へ更新。base(26.04 / glibc 2.43)からCOPY --fromするバイナリと glibc を揃えるため。nvidia/cudaの ubuntu26.04 タグは CUDA 13.3.1 系のみが提供されているため、CUDA / cuDNN も 12.6.3 → 13.3.1 へ上がるUbuntu 26.04 への更新にあたり確認したこと
dists/resolute200)/ HashiCorp(200)/ gh・Chrome(stableでディストリ非依存)/ NodeSource(nodistroスイートで codename 非依存)chromium-browser/fonts-noto-cjk/libxss1/libnss3などのパッケージは存在。ubuntuユーザ(uid 1000)も同じpython3.12/3.13は既定リポジトリに無いため、必要な場合はuv python install 3.12を使う(uv は導入済み)php8.3-*は無くphp8.5-*(8.5.4-0ubuntu1.2)がある。php8.5-redis(6.2.0, universe)も存在し、php8.5-exifはphp8.5-commonの Provides で解決されるdists/resolute/Release200)。$(lsb_release -cs)のままでmysql-shellを導入できる動作確認
devbase-baseフルビルド成功(exit 0)。Ubuntu 26.04 LTS / node 24.20.0 / npm 11.19.0 / codex 0.150.1 / gemini 0.57.0 / claude 2.1.250 / kiro-cli 2.20.1 / gh 2.98.0 / Terraform 1.16.0 / aws-cli 2.36.33 / gcloud 582.0.0 / playwright 1.62.1(chromium 導入 OK)ubuntuユーザで sudo なしのnpm i -g @openai/codex@latestが成功(本 PR の主目的)ubuntu:npm/2755(setgid 継承)で作成されることを確認devbase-trygroupビルド成功。pnpm 11.24.0、ubuntu でnpm i -g pnpm@latest成功、Poetry 2.4.1 が Python 3.14.4 上で正常動作(26.04 更新の最大の懸念点)devbase-bi-toolsビルド成功。lightdash 2.41.0、dbt Core 1.12.3(uv の Python 3.11 固定のため 3.14 の影響なし)devbase-phpビルド成功。PHP 8.5.4 (cli)/php-fpm8.5 8.5.4、拡張bcmath curl exif gd mbstring mysqli pdo_mysql redis xml zipロード確認、mysql 8.4.10/mysqlsh 8.4.8/composer 2.10.2動作devbase-php85ビルド成功(PPA なし)。PHP 8.5.4 (cli)、拡張構成はdevbase-phpと同一devbase-snapshotビルド成功。Ubuntu 26.04 LTS/zstd 1.5.7devbase-lfmフルビルド成功(docker buildx build --load containers/lfm, exit 0 / linux/arm64 / GPU なし)。Ubuntu 26.04 LTS/GLIBC 2.43(base と一致)/nvcc 13.3 (V13.3.73)/ cuDNN9.24.0/ node 24.20.0 / npm 11.19.0 / gh 2.98.0 / aws-cli 2.36.33 / gcloud 582.0.0 / rustc 1.98.0 / mecab 0.996 / gfortran 15.2.0 / docker 29.7.2 / terraform 1.16.0 / google-chrome 152.0.7977.64 / playwright 1.62.1(chromium 導入 OK)。イメージサイズ 24.1GBdevbase-lfm内でid ubuntuに2000(npm)が解決され、prefix はdrwxrwsr-x ubuntu npm。ubuntu ユーザで sudo なしのnpm i -g cowsay@1.6.0が成功(ubuntu:npm/2755)。codex/gemini/yarn/tsc/playwrightも/usr/local/share/npm-global/bin/で解決devbase-lfmの GPU 実機での CUDA 13.3 動作確認(本環境に GPU が無いため未実施)devbase build実機確認スクリーンショット・ログ(任意)
やらないこと / フォローアップ
本 PR のスコープ外として、意図的に対応していない項目。
1.
devbase-lfmの GPU ライブラリ(PyTorch 等)の CUDA 13.x 追随lfm のベース OS / glibc 非互換は 本 PR で解消済み(
nvidia/cuda:13.3.1-cudnn-devel-ubuntu26.04へ更新し、実ビルドで確認)。ただしこの更新に伴い CUDA が 12.6 → 13.3、cuDNN が 9.24.0 へ上がるため、lfm 上で利用する PyTorch などの GPU ライブラリは cu13x 対応ビルド(例:
--index-url https://download.pytorch.org/whl/cu130)を選択する必要がある。これらのライブラリは lfm イメージには同梱しておらずプロジェクト側で導入するものなので、本 PR では対応しない。また、本 PR の実ビルド検証は GPU の無い環境(linux/arm64)で行っているため、GPU 実機での CUDA 13.3 動作確認は別途必要。
2.
containers/phpとcontainers/php85の統廃合containers/phpを 8.5 化した結果、containers/php85とほぼ同一内容になった。統合はプロジェクト側のイメージ参照名の変更を伴い挙動変更になるため、本 PR では行わない。別途整理する。補足
devbase-base:latestは 26.04 版に更新済み。上書き前の noble 版はローカルにdevbase-base:noble-backupとして退避してあるlib/devbase/**/CHANGELOG.md/docs/user/environment-variables.md/tests/editor/**)は別作業のため、この PR には含めていない