diff --git a/containers/base/Dockerfile b/containers/base/Dockerfile
index 5d0b8e8e..b51e567b 100644
--- a/containers/base/Dockerfile
+++ b/containers/base/Dockerfile
@@ -1,8 +1,11 @@
# ==================================
# devbase-base: 共通基盤イメージ
-# Ubuntu noble + 共通ツール群
+# Ubuntu 26.04 LTS (resolute) + 共通ツール群
# ==================================
-FROM ubuntu:noble
+# 26.04 は 2026-04 リリースの最新 LTS (サポート 2031-04 まで)。
+# 24.04 (noble) からの主な差分は system python が 3.12 -> 3.14 になること。
+# 3.12/3.13 は既定リポジトリに無いため、必要なら `uv python install 3.12` を使う。
+FROM ubuntu:26.04
ENV DEBIAN_FRONTEND=noninteractive
@@ -59,8 +62,45 @@ RUN --mount=type=cache,target=/var/cache/apt,sharing=locked \
apt-get clean; \
rm -rf /var/lib/apt/lists/* /var/cache/apt/archives/* /tmp/* /var/tmp/*
+# ユーザー設定
+# npm グローバル領域 (後述の NPM_CONFIG_PREFIX) を sudo なしで更新できるようにするため、
+# ユーザーとグループは npm パッケージのインストールより「前」に作っておく。
+# こうすると所有者・パーミッションの変更を install と同じ RUN 内で完結でき、
+# 数百MBの node_modules がメタデータ変更だけのために新しいレイヤーへ
+# 丸ごと複製されるのを避けられる。
+ARG USERNAME="ubuntu"
+# npm グループの GID は派生イメージ (containers/lfm) と揃える必要があるため固定する。
+# lfm は base から /usr/local を COPY するだけで base のグループ定義を引き継がないため、
+# GID が動的だと COPY されたファイルの GID が派生側で未定義になる。
+# 2000 は Ubuntu の system group (<1000) とも既定ユーザー ubuntu (1000) とも衝突しない。
+ARG NPM_GID="2000"
+RUN set -eux; \
+ groupadd -f users; \
+ groupadd -f docker; \
+ groupadd -g "$NPM_GID" npm; \
+ if ! id -u $USERNAME >/dev/null 2>&1; then \
+ useradd -m -s /bin/bash $USERNAME; \
+ fi; \
+ usermod -aG users,docker,npm $USERNAME; \
+ echo '%users ALL=(ALL:ALL) NOPASSWD: ALL' > /etc/sudoers.d/users; \
+ echo "$USERNAME ALL=(ALL:ALL) NOPASSWD: ALL" > /etc/sudoers.d/$USERNAME; \
+ chmod 0440 /etc/sudoers.d/users /etc/sudoers.d/$USERNAME
+
+# npm のグローバル prefix を /usr/local/share/npm-global に置く。
+# 既定の /usr/lib/node_modules + /usr/bin は root しか書けず、ubuntu ユーザでの
+# `npm i -g`(codex などの自動バージョンアップ)が EACCES で失敗するため。
+# 置き場所とパーミッション設計は Dev Containers 標準
+# (devcontainers/images の javascript-node) に合わせている。
+# ディレクトリは ubuntu:npm 所有 + setgid で作る(下の RUN で実施)。
+ENV NPM_CONFIG_PREFIX=/usr/local/share/npm-global
+ENV PATH="/usr/local/share/npm-global/bin:${PATH}"
+
# AWS CLI + gcloud SDK + uv + npm globals(1レイヤーにまとめる)
RUN set -eux; \
+ # 所有を $USERNAME:npm、ディレクトリへ setgid を付けて作る。
+ # 後から誰が入れてもグループが npm のまま揃う
+ # (UID/GID を振り直しても壊れない Dev Containers 方式)。
+ install -d -m 2775 -o "$USERNAME" -g npm "$NPM_CONFIG_PREFIX"; \
# AWS CLI v2
curl -fsSL "https://awscli.amazonaws.com/awscli-exe-linux-$(uname -m).zip" -o /tmp/awscliv2.zip; \
unzip -q /tmp/awscliv2.zip -d /tmp; \
@@ -93,8 +133,14 @@ RUN set -eux; \
docker-credential-gcr cloud-run-proxy 2>&1 || true; \
# uv (Python パッケージマネージャー)
curl -LsSf https://astral.sh/uv/install.sh | sh; \
- # npm グローバルパッケージ
+ # npm グローバルパッケージ(umask 0002 で npm グループにも書き込み権を残す)
+ umask 0002; \
npm i -g yarn @playwright/test aws-cdk aws-cdk-lib typescript @google/gemini-cli @openai/codex; \
+ # root が作ったファイルも ubuntu が上書きできるように揃える。
+ # install レイヤーと同じ RUN なのでレイヤーの複製は発生しない。
+ chown -R "$USERNAME":npm "$NPM_CONFIG_PREFIX"; \
+ chmod -R g+rwX "$NPM_CONFIG_PREFIX"; \
+ find "$NPM_CONFIG_PREFIX" -type d -exec chmod g+s {} +; \
# クリーンアップ
rm -rf /tmp/* /var/tmp/* \
/root/.npm /root/.cache /root/.config \
@@ -112,18 +158,6 @@ ENV PATH="/root/.local/bin:/opt/google-cloud-sdk/bin:${PATH}"
# 確認
RUN gh --version && node --version && npm --version && aws --version && gcloud --version && session-manager-plugin --version
-# ユーザー設定
-ARG USERNAME="ubuntu"
-RUN groupadd -f users; \
- groupadd -f docker; \
- if ! id -u $USERNAME >/dev/null 2>&1; then \
- useradd -m -s /bin/bash $USERNAME; \
- fi; \
- usermod -aG users,docker $USERNAME; \
- echo '%users ALL=(ALL:ALL) NOPASSWD: ALL' > /etc/sudoers.d/users; \
- echo "$USERNAME ALL=(ALL:ALL) NOPASSWD: ALL" > /etc/sudoers.d/$USERNAME; \
- chmod 0440 /etc/sudoers.d/users /etc/sudoers.d/$USERNAME
-
USER ${USERNAME}
WORKDIR /tmp
diff --git a/containers/bi-tools/Dockerfile b/containers/bi-tools/Dockerfile
index 31e1ae8f..cfd1d441 100644
--- a/containers/bi-tools/Dockerfile
+++ b/containers/bi-tools/Dockerfile
@@ -23,8 +23,10 @@
FROM devbase-base:latest
-# --- root: グローバル npm CLI(Lightdash クライアント)---
-USER root
+# --- ubuntu: グローバル npm CLI(Lightdash クライアント)---
+# npm のグローバル prefix (/usr/local/share/npm-global) は base で ubuntu 所有にしてあるため
+# root へ切り替えずにインストールする(root で入れると ubuntu が更新できなくなる)。
+USER ubuntu
RUN set -eux; \
npm i -g @lightdash/cli; \
lightdash --version
diff --git a/containers/lfm/Dockerfile b/containers/lfm/Dockerfile
index cbb3453b..3345090f 100644
--- a/containers/lfm/Dockerfile
+++ b/containers/lfm/Dockerfile
@@ -6,7 +6,7 @@
# ==================================
# Stage: CUDA ベース + 追加パッケージ
# ==================================
-FROM nvidia/cuda:12.6.3-cudnn-devel-ubuntu24.04 AS cudabase
+FROM nvidia/cuda:13.3.1-cudnn-devel-ubuntu26.04 AS cudabase
ENV DEBIAN_FRONTEND=noninteractive
@@ -75,6 +75,14 @@ RUN locale-gen en_US.UTF-8 && \
FROM cudabase
# devbase-base から共通ツールをコピー
+#
+# 【重要】cudabase の Ubuntu バージョンは devbase-base と必ず一致させること。
+# 下の COPY は node / gh 等の「ビルド済みバイナリ」を持ち込むため、
+# devbase-base (ubuntu:26.04 / glibc 2.43) より古い OS の上に置くと
+# "GLIBC_2.4x not found" で即座に壊れる。そのため cudabase には
+# nvidia/cuda の ubuntu26.04 タグを使用する。
+# なお nvidia/cuda の ubuntu26.04 タグは CUDA 13.3.1 系のみが提供されているため、
+# containers/base の Ubuntu を上げる際は CUDA のバージョンも追随させる必要がある。
COPY --from=devbase-base:latest /usr/local /usr/local
COPY --from=devbase-base:latest /usr/bin/gh /usr/bin/node /usr/bin/
COPY --from=devbase-base:latest /usr/lib/node_modules /usr/lib/node_modules
@@ -85,16 +93,30 @@ COPY --from=devbase-base:latest /home/ubuntu/.local /home/ubuntu/.local
RUN ln -sf /usr/lib/node_modules/npm/bin/npm-cli.js /usr/bin/npm && \
ln -sf /usr/lib/node_modules/npm/bin/npx-cli.js /usr/bin/npx
-ENV PATH="/home/ubuntu/.local/bin:/opt/google-cloud-sdk/bin:${PATH}"
+# npm のグローバル prefix は base と同じ(上の COPY /usr/local で取り込み済み。
+# COPY --from は所有者を保持するので ubuntu:npm 所有のまま = sudo なしで `npm i -g` できる。
+# ただし npm グループの定義自体は COPY されないので、下のユーザー設定で
+# base と同じ GID で作り直して整合させる)。
+ENV NPM_CONFIG_PREFIX=/usr/local/share/npm-global
+ENV PATH="/usr/local/share/npm-global/bin:/home/ubuntu/.local/bin:/opt/google-cloud-sdk/bin:${PATH}"
# 確認
RUN gh --version && node --version && npm --version && aws --version && gcloud --version
# ユーザー設定
ARG USERNAME="ubuntu"
-RUN usermod -aG users,docker $USERNAME && \
- echo '%users ALL=(ALL:ALL) NOPASSWD: ALL' > /etc/sudoers.d/users && \
- echo "$USERNAME ALL=(ALL:ALL) NOPASSWD: ALL" > /etc/sudoers.d/$USERNAME && \
+# npm グループの GID は containers/base/Dockerfile の ARG NPM_GID と必ず一致させる。
+# COPY --from が持ち込んだ /usr/local/share/npm-global 配下のファイルは GID 数値だけを
+# 保持するため、lfm 側に同じ GID のグループが無いと GID が未定義のまま残り、
+# setgid ディレクトリも効かず ubuntu が sudo なしで `npm i -g` できなくなる。
+# ここで chown -R し直さないのは、数百MBの node_modules が丸ごと
+# 新しいレイヤーへ複製されイメージが肥大化するため。
+ARG NPM_GID="2000"
+RUN set -eux; \
+ groupadd -g "$NPM_GID" npm; \
+ usermod -aG users,docker,npm $USERNAME; \
+ echo '%users ALL=(ALL:ALL) NOPASSWD: ALL' > /etc/sudoers.d/users; \
+ echo "$USERNAME ALL=(ALL:ALL) NOPASSWD: ALL" > /etc/sudoers.d/$USERNAME; \
chmod 0440 /etc/sudoers.d/users /etc/sudoers.d/$USERNAME
USER ${USERNAME}
diff --git a/containers/php/Dockerfile b/containers/php/Dockerfile
index 53fb97dc..632dddf7 100644
--- a/containers/php/Dockerfile
+++ b/containers/php/Dockerfile
@@ -1,18 +1,20 @@
# Dockerfile.dev - devbase互換の開発コンテナ
-# devbase-baseをベースに、PHP 8.3 + MySQL Client + 一般的なPHP拡張を追加
+# devbase-baseをベースに、PHP 8.5 + MySQL Client + 一般的なPHP拡張を追加
FROM devbase-base:latest
USER root
-# PHP 8.3 + 必要な拡張 + MySQL Client をUbuntuリポジトリからインストール
+# PHP 8.5 + 必要な拡張 + MySQL Client をUbuntuリポジトリからインストール
+# base が ubuntu:26.04 (resolute) になったため php8.3-* は標準リポジトリに存在しない。
+# 26.04 の標準リポジトリが php8.5 (8.5.4) を提供するので PPA は不要。
RUN set -eux; \
apt-get update; \
apt-get install -y \
- php8.3-fpm php8.3-cli php8.3-common \
- php8.3-gd php8.3-bcmath php8.3-mysql \
- php8.3-zip php8.3-exif php8.3-redis \
- php8.3-mbstring php8.3-xml php8.3-curl \
+ php8.5-fpm php8.5-cli php8.5-common \
+ php8.5-gd php8.5-bcmath php8.5-mysql \
+ php8.5-zip php8.5-exif php8.5-redis \
+ php8.5-mbstring php8.5-xml php8.5-curl \
default-mysql-client; \
rm -rf /var/lib/apt/lists/*
diff --git a/containers/php85/Dockerfile b/containers/php85/Dockerfile
index 5424f880..37f194ec 100644
--- a/containers/php85/Dockerfile
+++ b/containers/php85/Dockerfile
@@ -5,11 +5,11 @@ FROM devbase-base:latest
USER root
-# Ondřej Surý PPA追加 + PHP 8.5 + 必要な拡張 + MySQL Client をインストール
+# PHP 8.5 + 必要な拡張 + MySQL Client をUbuntuリポジトリからインストール
+# base が ubuntu:26.04 (resolute) になり、標準リポジトリが php8.5 (8.5.4) を
+# 提供するようになったため ppa:ondrej/php は不要になった。
+# (ondrej PPA は resolute 向けの dist を公開しておらず、追加すると apt-get update が失敗する)
RUN set -eux; \
- apt-get update; \
- apt-get install -y software-properties-common; \
- add-apt-repository -y ppa:ondrej/php; \
apt-get update; \
apt-get install -y \
php8.5-fpm php8.5-cli php8.5-common \
diff --git a/containers/snapshot/Dockerfile b/containers/snapshot/Dockerfile
index 878f4f1f..6519c7ef 100644
--- a/containers/snapshot/Dockerfile
+++ b/containers/snapshot/Dockerfile
@@ -1,8 +1,8 @@
# ==================================
# devbase-snapshot: スナップショット専用軽量イメージ
-# Ubuntu noble + tar + zstd のみ
+# Ubuntu 26.04 + tar + zstd のみ
# ==================================
-FROM ubuntu:noble
+FROM ubuntu:26.04
RUN apt-get update -qq \
&& apt-get install -y --no-install-recommends zstd \
diff --git a/containers/trygroup/Dockerfile b/containers/trygroup/Dockerfile
index f0614420..5d8d07a9 100644
--- a/containers/trygroup/Dockerfile
+++ b/containers/trygroup/Dockerfile
@@ -5,12 +5,14 @@
FROM devbase-base:latest
-# --- root レイヤー: pnpm(npm グローバル) ---
-USER root
+# --- user レイヤー: pnpm(npm グローバル) ---
+# npm のグローバル prefix (/usr/local/share/npm-global) は base で ubuntu 所有にしてあるため
+# root へ切り替えずにインストールする(root で入れると ubuntu が更新できなくなる)。
+USER ubuntu
RUN set -eux; \
npm i -g pnpm; \
npm cache clean --force; \
- rm -rf /root/.npm
+ rm -rf ~/.npm
# --- user レイヤー: Poetry ---
# uv との競合回避:
diff --git a/docs/developer/contributing.md b/docs/developer/contributing.md
index d520e60d..cdc0dc9a 100644
--- a/docs/developer/contributing.md
+++ b/docs/developer/contributing.md
@@ -199,7 +199,7 @@ def cmd_env_sync(devbase_root: Path, args) -> int:
| 項目 | ルール |
|------|--------|
-| ベースイメージ | バージョンを明示する(`ubuntu:noble` 等、`latest` は避ける) |
+| ベースイメージ | バージョンを明示する(`ubuntu:26.04` 等、`latest` は避ける) |
| RUN コマンド | 論理的なグループ単位でまとめる。1行1コマンドの羅列は避ける |
| 実行ユーザー | 最終的に `USER ubuntu` で実行する |
| キャッシュ | apt のキャッシュはレイヤー内で削除する |
diff --git a/docs/developer/extending.md b/docs/developer/extending.md
index c5abf52d..a0a4da13 100644
--- a/docs/developer/extending.md
+++ b/docs/developer/extending.md
@@ -241,14 +241,14 @@ devbase のコンテナイメージは `containers/` ディレクトリに定義
```mermaid
flowchart TB
- Ubuntu["ubuntu:noble"] --> Base["devbase-base
Docker CLI, Python 3"]
+ Ubuntu["ubuntu:26.04"] --> Base["devbase-base
Docker CLI, Python 3"]
Base --> General["devbase-general
AWS CLI, gcloud, Node.js, etc."]
Base --> Go["devbase-go
Go 開発環境"]
- General --> PHP["devbase-php
PHP 8.3, Composer"]
+ General --> PHP["devbase-php
PHP 8.5, Composer"]
General --> LaTeX["devbase-latex
LaTeX"]
General --> LFM["devbase-lfm
Rust, gfortran, MeCab"]
- Ubuntu2["ubuntu:noble"] --> Snapshot["devbase-snapshot
zstd のみ(軽量)"]
+ Ubuntu2["ubuntu:26.04"] --> Snapshot["devbase-snapshot
zstd のみ(軽量)"]
```
### 手順 1: ディレクトリとDockerfileの作成
@@ -285,7 +285,7 @@ USER ubuntu
|------|-----------|
| AWS CLI / gcloud / Node.js 等の一般的な開発ツールが必要 | `devbase-general` |
| 最小限のツールだけでよい(Docker CLI + Python 3) | `devbase-base` |
-| Docker も不要で極めて軽量なイメージが必要 | `ubuntu:noble` から直接構築 |
+| Docker も不要で極めて軽量なイメージが必要 | `ubuntu:26.04` から直接構築 |
### 手順 2: ビルドと compose.yml への組み込み
diff --git a/docs/plugin-dev/compose-yml-guidelines.md b/docs/plugin-dev/compose-yml-guidelines.md
index 4aa70651..cb885d3c 100644
--- a/docs/plugin-dev/compose-yml-guidelines.md
+++ b/docs/plugin-dev/compose-yml-guidelines.md
@@ -149,13 +149,13 @@ flowchart TD
| イメージ | ベース | 主要ツール | 典型的な用途 |
|---------|--------|-----------|-------------|
-| `base` | Ubuntu Noble | Docker CLI、Python 3 | 軽量な自動化・スクリプト |
+| `base` | Ubuntu 26.04 | Docker CLI、Python 3 | 軽量な自動化・スクリプト |
| `general` | base | AWS CLI、gcloud、Terraform、Node.js 20、AI CLI | Webアプリ、インフラ管理 |
| `go` | base | Go開発環境 | APIサーバー、CLIツール |
-| `php` | general | PHP 8.3、Composer | Laravel、WordPress |
+| `php` | general | PHP 8.5、Composer | Laravel、WordPress |
| `latex` | general | LaTeX | 論文、技術文書、レポート |
| `lfm` | general | Rust、gfortran、MeCab | 数値計算、自然言語処理 |
-| `snapshot` | Ubuntu Noble | zstd | スナップショットの取得・復元 |
+| `snapshot` | Ubuntu 26.04 | zstd | スナップショットの取得・復元 |
### 4.2 標準イメージの使用
diff --git a/docs/plugin-dev/quickstart.md b/docs/plugin-dev/quickstart.md
index aec54434..13c43574 100644
--- a/docs/plugin-dev/quickstart.md
+++ b/docs/plugin-dev/quickstart.md
@@ -330,14 +330,14 @@ flowchart LR
| イメージ | ベース | 主要ツール | 推奨用途 |
|---------|--------|-----------|---------|
-| `base` | Ubuntu Noble | Docker CLI、Python 3 | 軽量な開発環境 |
+| `base` | Ubuntu 26.04 | Docker CLI、Python 3 | 軽量な開発環境 |
| `general` | base | AWS CLI、gcloud、Terraform、Node.js 20、AI CLI | 汎用開発 |
| `go` | base | Go開発環境 | Go言語プロジェクト |
-| `php` | general | PHP 8.3、Composer | PHP 8.3 系プロジェクト |
+| `php` | general | PHP 8.5、Composer | PHP 8.5 系プロジェクト |
| `php85` | general | PHP 8.5、Composer | PHP 8.5 系プロジェクト |
| `latex` | general | LaTeX | 文書・論文作成 |
| `lfm` | general | Rust、gfortran、MeCab | 数値計算・自然言語処理 |
-| `snapshot` | Ubuntu Noble | zstd | スナップショット専用 |
+| `snapshot` | Ubuntu 26.04 | zstd | スナップショット専用 |
### 5.5 Git管理のガイドライン
diff --git a/docs/user/container-operations.md b/docs/user/container-operations.md
index b140ec57..ccf2d5cc 100644
--- a/docs/user/container-operations.md
+++ b/docs/user/container-operations.md
@@ -194,7 +194,7 @@ devbase のコンテナイメージは用途に応じた階層構造になって
```mermaid
graph TD
- A[Ubuntu Noble] --> B[base]
+ A[Ubuntu 26.04] --> B[base]
B --> C[general]
B --> G[go]
C --> D[php]
@@ -214,14 +214,14 @@ graph TD
| イメージ | ベース | 主な内容 | 用途 |
|---------|-------|---------|------|
-| **base** | Ubuntu Noble | Docker CLI、Python 3 | 最小限の開発環境 |
+| **base** | Ubuntu 26.04 | Docker CLI、Python 3 | 最小限の開発環境 |
| **general** | base | AWS CLI、gcloud、Terraform、Node.js 20、AI CLI | 汎用開発環境 |
-| **php** | general | PHP 8.3、Composer、MySQL Shell | PHP 8.3 系 開発 |
+| **php** | general | PHP 8.5、Composer、MySQL Shell | PHP 8.5 系 開発 |
| **php85** | general | PHP 8.5、Composer、MySQL Shell | PHP 8.5 系 開発 |
| **latex** | general | LaTeX | 文書作成 |
| **lfm** | general | Rust、gfortran、MeCab | 数値計算・自然言語処理 |
| **go** | base | Go 開発環境 | Go 開発 |
-| **snapshot** | Ubuntu Noble | zstd のみ(約 80MB) | スナップショット専用 |
+| **snapshot** | Ubuntu 26.04 | zstd のみ(約 80MB) | スナップショット専用 |
### AI CLI エイリアス