Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
24 changes: 17 additions & 7 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -25,12 +25,11 @@
GPU を使うホストの NVIDIA ドライバは CUDA 13.4 以上に対応している必要があります(`nvidia-smi` の
`CUDA Version` で確かめられます)。足りないと `--gpus all` の起動が requirement error で止まるので、
ドライバを最新に上げてから `devbase build lfm` で建て直してください。
- **base イメージに Playwright の Chromium を残すようにしました(#220)。** これまではビルドで取得した
ブラウザを直後の片付けで捨てており、arm64(Apple Silicon)のコンテナには起動できる Chromium が
ありませんでした。ブラウザの置き場は `/opt/ms-playwright` で、環境変数 `PLAYWRIGHT_BROWSERS_PATH` が
指します。実行時に `playwright install` で取得するブラウザも `~/.cache/ms-playwright` ではなくここへ
入ります。起動できなかった `chromium-browser`(Ubuntu の snap スタブ)は外しました。base の後に
派生イメージを建て直すと届きます。
- **Playwright のブラウザの置き場を `/opt/ms-playwright` にしました(#220)。** 環境変数
`PLAYWRIGHT_BROWSERS_PATH` が指し、実行時に `playwright install` で取得するブラウザも
`~/.cache/ms-playwright` ではなくここへ入ります。ビルドで取得した Chromium は片付けで消えず、
arm64(Apple Silicon)でも起動できます。Chromium はブラウザの派生イメージ `devbase-browser` が持ちます
(#402)。起動できなかった `chromium-browser`(Ubuntu の snap スタブ)は外しました。

### Removed
- **派生イメージ `containers/lfm` を廃止しました(#403、破壊的変更)。** 使うプロジェクトが無く、
Expand All @@ -53,11 +52,22 @@
base を建て直し、派生イメージも建て直してください。
- **amd64 の base イメージからシステムの Chrome(`google-chrome-stable`)を外しました(#401、破壊的変更)。**
Google の apt の取得元も足しません。arm64 にはもともと無く、ブラウザは両アーキとも Playwright の
Chromium(`/opt/ms-playwright`)にそろいます。amd64 の base は Chrome と依存を合わせて約 540MB
Chromium(`/opt/ms-playwright`。#402 からはブラウザの派生イメージ `devbase-browser` にあります)にそろいます。amd64 の base は Chrome と依存を合わせて約 540MB
小さくなります。Playwright から使う処理はそのまま動きます。`/usr/bin/google-chrome` を呼んでいた
道具には、`NODE_PATH="$(npm root -g)" node -e "console.log(require('@playwright/test').chromium.executablePath())"`
で得られる Playwright の Chromium のパスを渡してください。反映には `devbase build base` で base を
建て直し、派生イメージも建て直してください。
- **base イメージから Playwright の Chromium とその依存パッケージ・Noto CJK の追加の太さ
(`fonts-noto-cjk-extra`)・`terraform` を外しました(#402、破壊的変更)。** すべての利用者が使う道具では
なく、arm64 で合わせて 1GB を超えていました。HashiCorp の apt の取得元も足しません。`@playwright/test` と
ブラウザの置き場 `/opt/ms-playwright`(空)は base に残り、標準の太さの日本語・中国語・韓国語と欧文の
metric 互換の描画は変わりません。ブラウザと追加の太さのフォントは、新しい派生イメージ
`devbase-browser`(`containers/browser`)にあります。要るプロジェクトは dev サービスの `build.context` を
`${DEVBASE_ROOT}/containers/browser/` にしてください。`php` など別の派生イメージの道具も要るとき、
`terraform` を入れるときの手順は
[コンテナ操作ガイド: ブラウザ・追加の太さのフォント・terraform を使う](docs/user/container-operations.md#ブラウザ追加の太さのフォントterraform-を使う)
にあります。反映には `devbase build base` で base を、続けて使っている派生イメージを建て直し、
`devbase down` → `devbase up` でコンテナを作り直してください。

### Fixed
- **スナップショットの差分バックアップが、毎回ボリューム全体を控えていたのを直しました。**
Expand Down
51 changes: 25 additions & 26 deletions containers/base/Dockerfile
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,11 @@ RUN --mount=type=cache,target=/var/cache/apt,sharing=locked \
openssh-client \
curl ca-certificates gnupg lsb-release \
libnss3 libxrandr2 libxss1 \
fonts-noto-cjk fonts-noto-cjk-extra \
fonts-noto-cjk \
# fc-match の解決先 (Arial -> Liberation Sans、WenQuanYi Zen Hei・IPAPGothic の名指し) を保つ。
# Playwright の --with-deps に頼らず明示する。追加の太さの fonts-noto-cjk-extra と
# Chromium はブラウザの派生イメージ (containers/browser) に置く (#402)
fonts-liberation fonts-ipafont-gothic fonts-wqy-zenhei \
# 欧文の metric 互換 (Calibri -> Carlito / Cambria -> Caladea)。
# 30-metric-aliases.conf が既に対応を持っており、実体が無いと中国語フォントへ落ちる。
fonts-crosextra-carlito fonts-crosextra-caladea \
Expand All @@ -45,27 +49,24 @@ RUN --mount=type=cache,target=/var/cache/apt,sharing=locked \
chmod a+r /etc/apt/keyrings/docker.gpg; \
echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" \
> /etc/apt/sources.list.d/docker.list; \
# HashiCorp(Terraform)
curl -fsSL https://apt.releases.hashicorp.com/gpg \
| gpg --dearmor -o /etc/apt/keyrings/hashicorp-archive-keyring.gpg; \
echo "deb [signed-by=/etc/apt/keyrings/hashicorp-archive-keyring.gpg] https://apt.releases.hashicorp.com $(lsb_release -cs) main" \
> /etc/apt/sources.list.d/hashicorp.list; \
# terraform と HashiCorp の取得元は入れない。要るプロジェクトは自分の Dockerfile かフックで入れる (#402)
# GitHub CLI リポジトリ
curl -fsSL https://cli.github.com/packages/githubcli-archive-keyring.gpg \
| dd of=/usr/share/keyrings/githubcli-archive-keyring.gpg; \
echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/githubcli-archive-keyring.gpg] https://cli.github.com/packages stable main" \
> /etc/apt/sources.list.d/github-cli.list; \
# NodeSource リポジトリ (Active LTS を追従。バージョン固定しない)
curl -fsSL https://deb.nodesource.com/setup_lts.x | bash -; \
# ブラウザは両アーキとも Playwright の Chromium だけを入れる (下の利用者の RUN が
# /opt/ms-playwright へ取得する)。システムの Chrome (google-chrome-stable) は入れない (#401)。
# Ubuntu の chromium-browser は snap スタブでコンテナの中では起動しないため入れない (#220)
# base はブラウザを入れない。Playwright の Chromium とその依存パッケージはブラウザの派生イメージ
# (containers/browser) が /opt/ms-playwright へ取得する (#402)。システムの Chrome
# (google-chrome-stable) は入れない (#401)。Ubuntu の chromium-browser は snap スタブで
# コンテナの中では起動しないため入れない (#220)
apt-get update; \
# パッケージインストール
apt-get install -y --no-install-recommends \
docker-ce-cli \
docker-buildx-plugin docker-compose-plugin \
terraform gh nodejs; \
gh nodejs; \
# クリーンアップ。/usr/share/doc は copyright とディレクトリを指す symlink
# (copyright への経路) だけを残す。除外の設定より前から ubuntu:26.04 にある物も消す (#400)
apt-get clean; \
Expand Down Expand Up @@ -105,9 +106,10 @@ RUN set -eux; \
ENV NPM_CONFIG_PREFIX=/usr/local/share/npm-global
ENV PATH="/usr/local/share/npm-global/bin:${PATH}"

# Playwright のブラウザの置き場。~/.cache の既定の置き場は下の片付けで消えるため、
# 片付けの対象外の /opt に置いてイメージに残す (#220)。ENV にするのは docker exec の
# 非対話の処理からも同じ置き場を使うため。
# Playwright のブラウザの置き場。base では空のまま作り、中身 (Chromium) はブラウザの派生
# イメージ (containers/browser) が持つ (#402)。~/.cache の既定の置き場は片付けで消えるため、
# 片付けの対象外の /opt に置く (#220)。ENV にするのは docker exec の非対話の処理と、
# 実行時に取得する道具からも同じ置き場を使うため。
ENV PLAYWRIGHT_BROWSERS_PATH=/opt/ms-playwright

# AWS CLI + gcloud SDK + npm globals(1レイヤーにまとめる)
Expand All @@ -116,8 +118,8 @@ RUN set -eux; \
# 後から誰が入れてもグループが npm のまま揃う
# (UID/GID を振り直しても壊れない Dev Containers 方式)。
install -d -m 2775 -o "$USERNAME" -g npm "$NPM_CONFIG_PREFIX"; \
# Playwright のブラウザの置き場も同じ形で作る。下の利用者の RUN が取得し、
# playwright-kit などが実行時に別の版を同じ置き場へ取得する (#220)
# Playwright のブラウザの置き場も同じ形で作る。ブラウザの派生イメージが取得し、
# playwright-kit などが実行時に別の版を同じ置き場へ取得する (#220, #402)
install -d -m 2775 -o "$USERNAME" -g npm "$PLAYWRIGHT_BROWSERS_PATH"; \
# AWS CLI v2
curl -fsSL "https://awscli.amazonaws.com/awscli-exe-linux-$(uname -m).zip" -o /tmp/awscliv2.zip; \
Expand Down Expand Up @@ -200,7 +202,7 @@ RUN gh --version && node --version && npm --version && aws --version && gcloud -
USER ${USERNAME}
WORKDIR /tmp

# ユーザー用ツール(uv, claude, kiro, playwright)
# ユーザー用ツール(uv, claude, agy, kiro)
RUN set -eux; \
# uv for user
curl -LsSf https://astral.sh/uv/install.sh | sh; \
Expand All @@ -226,12 +228,9 @@ RUN set -eux; \
else \
echo "Unsupported architecture: $ARCH, skipping Kiro CLI installation"; \
fi; \
# Playwright の Chromium。置き場 ($PLAYWRIGHT_BROWSERS_PATH) は上の root の RUN が作る (#220)
npx playwright install --with-deps chromium; \
# クリーンアップ。--with-deps の sudo apt や Node24/npm11 の
# /tmp/node-compile-cache が root 所有ファイルを残すため sudo で削除する
# (非 root の rm では Permission denied になりビルドが失敗する)。
# --with-deps の apt-get update が残す apt の一覧と、/usr/share/doc の copyright でない物も消す (#400)。
# クリーンアップ。Node24/npm11 の /tmp/node-compile-cache などが root 所有ファイルを
# 残すため sudo で削除する (非 root の rm では Permission denied になりビルドが失敗する)。
# apt の一覧と、/usr/share/doc の copyright でない物も消す (#400)。
# ブラウザの置き場 ($PLAYWRIGHT_BROWSERS_PATH) は消さない。
sudo find /usr/share/doc -mindepth 1 ! -type d ! -xtype d ! -name copyright -delete; \
sudo rm -rf /tmp/* \
Expand Down Expand Up @@ -295,10 +294,10 @@ RUN sudo ln -sf tmux-first /usr/local/bin/tmux1 \
# 先頭のコメントにある。利用者は ~/.config/fontconfig/fonts.conf (スロット 50) で上書きできる。
COPY --chmod=0644 fonts-local.conf /etc/fonts/local.conf

# フォントのキャッシュを作り直す。上の Playwright の RUN が --with-deps で
# fonts-wqy-zenhei / fonts-ipafont-gothic / fonts-liberation を入れた「後」でなければ、
# 後から入った書体を知らないキャッシュが残る。直後に ~/.cache を消しているため、
# ここで /var/cache/fontconfig を作り直してコンテナ初回起動時の生成を避ける。
# フォントのキャッシュを作り直す。上の local.conf の COPY の「後」に置き、利用者の RUN が
# ~/.cache を消した後でもキャッシュが残るよう、ここで /var/cache/fontconfig を作り直して
# コンテナ初回起動時の生成を避ける。ブラウザの派生イメージは足したフォントのために
# 自分でもう一度作り直す (#402)。
RUN sudo fc-cache -f

# entrypoint
Expand Down
2 changes: 1 addition & 1 deletion containers/bi-tools/Dockerfile
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@
# - Python パッケージマネージャ uv(ubuntu ユーザにインストール済み)
# - gcloud SDK(`bq` / `gcloud` を含む)
# - Node.js LTS(`node` / `npm` / `npx` / `yarn`)
# - Docker(DooD), gh, terraform, aws-cli, git 等
# - Docker(DooD), gh, aws-cli, git 等
#
# BIツール(tools/{evidence,lightdash,superset})の起動形態と CLI の扱い:
# - Lightdash : サーバは tools/lightdash の docker-compose で起動。ただし
Expand Down
35 changes: 35 additions & 0 deletions containers/browser/Dockerfile
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
# ==================================
# devbase-browser: ブラウザと文書のフォント
# devbase-base + Playwright の Chromium・ブラウザの依存パッケージ・追加の太さのフォント
# ==================================
# base はブラウザを持たない (#402)。ブラウザを動かす・HTML を PDF やスクリーンショットにする
# プロジェクトは、dev サービスの build.context でこのイメージを選ぶ。
# ブラウザの置き場 (/opt/ms-playwright) と ENV PLAYWRIGHT_BROWSERS_PATH は base から継ぐため、
# ここでは宣言しない。base のフォントの規則 (/etc/fonts/local.conf) も書き換えずに継ぐ。

FROM devbase-base:latest

# 追加の太さのフォント (Noto CJK の Thin・Light・Medium・Black など)。標準の太さは base の
# fonts-noto-cjk にある。標準のアーカイブのパッケージで、外部の取得元は要らない
USER root
RUN set -eux; \
apt-get update; \
apt-get install -y --no-install-recommends fonts-noto-cjk-extra; \
apt-get clean; \
rm -rf /var/lib/apt/lists/*

# Playwright の Chromium とその依存パッケージ。npx は base の @playwright/test の CLI を使うため、
# 版は base の @playwright/test に揃う。置き場は base の root の RUN が ubuntu:npm・2775 で作っている。
# 片付けは --with-deps の sudo apt が残す root 所有の物も消すため sudo で行い、
# ブラウザの置き場 ($PLAYWRIGHT_BROWSERS_PATH) とその親の /opt は消さない
USER ubuntu
RUN set -eux; \
npx playwright install --with-deps chromium; \
sudo find /usr/share/doc -mindepth 1 ! -type d ! -xtype d ! -name copyright -delete; \
sudo rm -rf /tmp/* \
/var/lib/apt/lists/* \
~/.cache \
~/.npm

# 上の 2 つの RUN が入れたフォントをキャッシュへ載せる
RUN sudo fc-cache -f
7 changes: 7 additions & 0 deletions containers/browser/compose.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
services:

dev:
image: devbase-browser:latest
build:
context: .
dockerfile: Dockerfile
Loading
Loading