Skip to content

feat(container): npm グローバルを ubuntu ユーザで更新可能にし、ベースを Ubuntu 26.04 LTS へ更新する - #117

Merged
takemi-ohama merged 4 commits into
mainfrom
feat/npm-global-non-root
Aug 28, 2026
Merged

takemi-ohama merged 4 commits into
mainfrom
feat/npm-global-non-root

Conversation

@takemi-ohama

@takemi-ohama takemi-ohama commented Aug 28, 2026 •

Copy link
Copy Markdown
Contributor

概要

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

  • なし

変更点

  • npm グローバル prefix を /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.04 LTS(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.5
  • containers/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 への更新にあたり確認したこと

  • 外部 apt リポジトリはすべて resolute 対応: Docker CE(dists/resolute 200)/ HashiCorp(200)/ gh・Chrome(stable でディストリ非依存)/ NodeSource(nodistro スイートで codename 非依存)
  • chromium-browser / fonts-noto-cjk / libxss1 / libnss3 などのパッケージは存在。ubuntu ユーザ(uid 1000)も同じ
  • system python が 3.12 → 3.14 に変わる。python3.12 / 3.13 は既定リポジトリに無いため、必要な場合は uv python install 3.12 を使う(uv は導入済み)
  • PHP は 8.3 → 8.5 に変わる。26.04 標準リポジトリに php8.3-* は無く php8.5-*(8.5.4-0ubuntu1.2)がある。php8.5-redis(6.2.0, universe)も存在し、php8.5-exif は php8.5-common の Provides で解決される
  • MySQL 公式 apt リポジトリも resolute 対応(dists/resolute/Release 200)。$(lsb_release -cs) のままで mysql-shell を導入できる
  • ベースイメージのサイズは 6.93GB → 7.6GB(実測。cross-review round 1 のレイヤー統合後は 6.71GB)

動作確認

  • 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.7
  • devbase-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) / cuDNN 9.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.1GB
  • devbase-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 実機確認

スクリーンショット・ログ(任意)

$ docker run --rm --entrypoint bash devbase-base:latest -lc '...'
OS: Ubuntu 26.04 LTS
prefix: /usr/local/share/npm-global
uid=1000(ubuntu) gid=1000(ubuntu) groups=...,docker,2000(npm)
drwxrwsr-x 1 ubuntu npm 4096 /usr/local/share/npm-global
drwxrwsr-x 1 ubuntu npm 4096 /usr/local/share/npm-global/lib/node_modules
--- npm i -g (sudo なし) ---
codex-cli 0.150.1
lrwxrwxrwx 1 ubuntu npm 33 /usr/local/share/npm-global/bin/cowsay -> ../lib/node_modules/cowsay/cli.js
ubuntu:npm 2755

やらないこと / フォローアップ

本 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 として退避してある
  • 作業ツリーに存在する window.title 関連の変更(lib/devbase/** / CHANGELOG.md / docs/user/environment-variables.md / tests/editor/**)は別作業のため、この PR には含めていない

…更新する

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 takemi-ohama left a comment

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🤖 cross-review | round 1 | codex | APPROVE

修正が必要な指摘はありません。

@takemi-ohama takemi-ohama left a comment

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🤖 cross-review | round 1 | gemini | REQUEST_CHANGES

  • base イメージの Dockerfile において、npm パッケージのインストールと、ディレクトリの所有者・権限変更が別々の RUN レイヤーで行われているため、数百MBのファイル群が不要にコピーされイメージサイズが肥大化します。
  • lfm イメージにおいて、base から COPY した /usr/local 以下の npm グループが lfm 側で未定義のため、setgid の効果が意図通りに働かない恐れがあります。

Comment thread containers/base/Dockerfile Outdated
Comment thread containers/lfm/Dockerfile
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
@takemi-ohama

Copy link
Copy Markdown
Contributor Author

🔧 cross-review fix | round 1

対応コミット: e49c096 (fix(container): npm グローバル領域の権限付与をレイヤー肥大なしにし、lfm の npm GID を揃える)

対応件数

区分 件数
対応済み 2
deferred 0
rejected 0
合計 2

重要度別(AI の付与ラベルをコードを読んで再判定した結果、いずれも major で妥当と判断):

重要度 件数
critical 0
major 2
minor 0
nit 0

対応内容

# ファイル 重要度 内容
1 containers/base/Dockerfile major / パフォーマンス ユーザー・グループ作成を npm install レイヤーより前へ移動。prefix は install -d -m 2775 -o ubuntu -g npm で作成し、chown -R / chmod -R g+rwX / setgid 付与を npm install と同じ RUN 内へ統合してレイヤー複製を解消
2 containers/base/Dockerfile, containers/lfm/Dockerfile major / 正確性 npm グループの GID を ARG NPM_GID="2000" で固定。lfm 側でも同じ GID で groupadd し usermod -aG users,docker,npm ubuntu を追加して GID を整合(lfm での chown -R は指摘 #1 と同じ肥大を招くため行わない)

実ビルド検証 (linux/arm64, Docker Desktop)

項目 結果
docker buildx build containers/base ✅ 成功
イメージサイズ ✅ 7.6GB → 6.71GB (-0.89GB / -11.7%)
id (ubuntu) ✅ uid=1000(ubuntu) ... 2000(npm)
npm config get prefix ✅ /usr/local/share/npm-global
ls -ld prefix ✅ drwxrwsr-x ubuntu npm(setgid 有効)
sudo なし npm i -g cowsay@1.6.0 ✅ 成功 → ubuntu:npm 2755
containers/trygroup ビルド ✅ 成功(--build-context で crossfix ベースに対して実施。pnpm 11.24.0 / poetry 2.4.1 動作、pnpm は ubuntu:npm 2755)
containers/lfm ⚠️ CUDA ベースのため手元では実ビルド不可。COPY 形状を ubuntu:24.04 へ再現した最小イメージで検証 → GID が npm として解決され、sudo なし npm i -g 成功
containers/bi-tools ⏭️ 今回変更なし(本 PR の元コミットで検証済み)

検証用の一時イメージ (*:crossfix) は削除済みです。devbase-base:latest / devbase-base:noble-backup は変更していません。

CI 状態

修正前スナップショット時点で全 5 チェック SUCCESS(Python syntax check 3.10/3.11/3.12、Ruff lint、ShellCheck)。今回の変更は Dockerfile のみのため影響なしと判断(再実行は待っていません)。

@takemi-ohama takemi-ohama left a comment

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🤖 cross-review | round 2 | codex | APPROVE

修正が必要な指摘はありません。

@takemi-ohama takemi-ohama left a comment

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🤖 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 を統一するか、依存関係のコピー方法を見直してください。

Comment thread containers/base/Dockerfile

@takemi-ohama takemi-ohama left a comment

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🤖 cross-review | round 2 | gemini | REQUEST_CHANGES

Ubuntu 26.04 への更新に際し、いくつか見落としによるビルド・実行障害のリスクがあります。詳細はインラインコメントに記載しましたが、主に devbase-php の標準パッケージ依存と、devbase-lfm における新しい glibc バイナリの旧 OS へのコピーについて確認・対応をお願いします。

Comment thread containers/base/Dockerfile
Comment thread containers/base/Dockerfile
Comment thread containers/lfm/Dockerfile
- 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
@takemi-ohama

Copy link
Copy Markdown
Contributor Author

🔧 cross-review fix | round 2

対応コミット: 38d0008 (fix(container): 26.04 移行に伴い php を 8.5 化し noble 表記と lfm の非互換を整理する)

対応件数

区分 件数
対応済み 2
deferred 2
rejected 0
合計 4

重要度別(AI 付与ラベルをコード・実測で再判定した結果、いずれも妥当と判断):

重要度 件数 内訳
critical 0 —
major 3 php8.3 非存在(対応済み)、lfm glibc 非整合 ×2(deferred)
minor 1 noble 表記の残り(対応済み)
nit 0 —

対応内容

# ファイル 重要度 区分 内容
1 containers/php/Dockerfile
containers/php85/Dockerfile
major / 正確性 対応済み php8.3-* → php8.5-*。26.04 標準リポジトリが php 8.5.4 を提供するため PPA は不要。逆に php85 側は ppa:ondrej/php が resolute 未対応(dists/resolute/Release 404)でビルドを壊すため PPA 追加を削除し標準リポジトリ利用へ
2 containers/snapshot/Dockerfile
docs/developer/extending.md
docs/developer/contributing.md
minor / 保守性 対応済み ubuntu:noble → ubuntu:26.04(計 5 箇所)。tests/cli/test_base_image_staleness.py の ubuntu:noble は「devbase 系以外の任意イメージ名」を表す fixture リテラルで、ベースイメージ選定と無関係のため変更不要と判断(スレッドに根拠を記載)
3 containers/lfm/Dockerfile major / 互換性・アーキテクチャ deferred base(26.04 / glibc 2.43) と lfm(CUDA 12.6.3-ubuntu24.04 / glibc 2.39) の非互換。nvidia/cuda の ubuntu26.04 タグは CUDA 13.3.1 系のみで 12.6.3 が存在せず、OS 統一には CUDA/cuDNN のメジャーアップグレードと GPU ライブラリ互換検証が必要なため本 PR スコープ外。放置ではなく COPY 直前に既知の非互換コメントを追加し、PR 本文に「やらないこと / フォローアップ」節を新設して記録(対象 2 スレッド)

事実確認(実測)

確認内容 結果
ubuntu:26.04 で apt-cache search '^php8.3' 0 件(php8.3 は存在しない)
ubuntu:26.04 で apt-cache policy php8.5-cli 8.5.4-0ubuntu1.2 (resolute/main)
ondrej PPA dists/{noble,resolute}/Release 200 / 404(resolute 未対応を確認)
MySQL 公式 repo dists/resolute/Release 200(lsb_release -cs のままで可)
glibc base(26.04) 2.43 vs lfm(CUDA 12.6.3-ubuntu24.04) 2.39

実ビルド検証 (linux/arm64, Docker Desktop)

項目 結果
docker buildx build containers/php ✅ 成功
php -v / php-fpm8.5 -v ✅ PHP 8.5.4 (cli) / 8.5.4 (fpm-fcgi)
拡張ロード ✅ bcmath curl exif gd mbstring mysqli pdo_mysql redis xml zip
mysql / mysqlsh / composer ✅ 8.4.10-0ubuntu0.26.04.1 / 8.4.8 / 2.10.2
docker buildx build containers/php85 ✅ 成功(PPA なし、PHP 8.5.4、拡張構成は php と同一)
docker buildx build containers/snapshot ✅ 成功(Ubuntu 26.04 LTS / zstd 1.5.7)
containers/base ⏭️ round 1 で検証済み・今回変更なし
containers/lfm ⏭️ deferred(CUDA ベースのため実ビルド不可)

検証用の一時イメージ (devbase-php:crossfix / devbase-php85:crossfix / devbase-snapshot:crossfix) は削除済みです。devbase-base:latest / devbase-base:noble-backup は変更していません。

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 takemi-ohama left a comment

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🤖 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 への仕様変更に合わせ、利用者が誤ったランタイム前提で選択しないよう関連文書を一括更新してください。

Comment thread containers/lfm/Dockerfile Outdated

@takemi-ohama takemi-ohama left a comment

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🤖 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
@takemi-ohama

Copy link
Copy Markdown
Contributor Author

🔧 cross-review fix | round 3

対応コミット: adbda8d (fix(container): lfm を CUDA 13.3.1 / Ubuntu 26.04 化し docs の版数表記を追随させる)

対応件数

区分 件数
対応済み 2
deferred 0
rejected 0
合計 2

重要度別(AI 付与ラベルをコード・実測で再判定した結果、いずれも妥当と判断):

重要度 件数 内訳
critical 0 —
major 1 lfm のビルド失敗(glibc 不整合)
minor 1 docs の版数表記の陳腐化
nit 0 —

あわせて round 2 で deferred としていた lfm 関連 2 スレッド(containers/base/Dockerfile:8 / containers/lfm/Dockerfile:103)も、本 round で解消したためフォローアップ返信を追記しました。

対応内容

1. containers/lfm/Dockerfile — major / 互換性(codex round 3 inline)

「コメント追記だけでは RUN gh --version && node --version && ... でビルドが落ちる」というご指摘のとおりでした。ユーザー判断により cudabase 自体を 26.04 化して解消しています。

項目 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 takemi-ohama left a comment

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🤖 cross-review | round 4 | codex | APPROVE

修正が必要な指摘はありません。

@takemi-ohama takemi-ohama left a comment

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🤖 cross-review | round 4 | gemini | APPROVE

変更内容は適切です。base イメージの 26.04 移行、npm グローバルインストールの権限整理(Dev Containers 方式への準拠と setgid の活用)、および PHP の標準リポジトリ移行など、いずれも既存の仕組みと矛盾なく安全に実装されていることを確認しました。問題ありません。

@takemi-ohama
takemi-ohama merged commit 551a5ca into main Aug 28, 2026
5 checks passed
@takemi-ohama
takemi-ohama deleted the feat/npm-global-non-root branch August 28, 2026 04:20
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant