Skip to content

単一ブランチ + docker-bake 構成へ刷新し PHP 8.0-8.5 に対応#7

Merged
uidev1116 merged 21 commits into
masterfrom
feature/unified-docker-images
Jul 3, 2026
Merged

単一ブランチ + docker-bake 構成へ刷新し PHP 8.0-8.5 に対応#7
uidev1116 merged 21 commits into
masterfrom
feature/unified-docker-images

Conversation

@uidev1116

Copy link
Copy Markdown
Contributor

概要

PHP バージョン・xdebug 有無を ブランチごとに Dockerfile を分ける方式から、
単一ブランチ + docker-bake.hclPHP_VERSIONS が唯一の版一覧)+ 引数化した 1 枚の Dockerfile へ刷新します。
WordPress の wpdev-docker-images の構成を参考にしています。

主な変更

  • 対応 PHP: 8.0 / 8.1 / 8.2 / 8.3 / 8.4 / 8.5(マルチアーキ linux/amd64,arm64
  • xdebug / pcov を同梱し実行時トグルACMS_XDEBUG=true / php -d pcov.enabled=1)→ -xdebug 専用イメージを廃止
  • exif 追加、imagick 復活、Node.js(nvm) 削除(イメージ縮小)
  • PHP 8.5 の OPcache 静的組込みに対応php -m で未ロード時のみ docker-php-ext-enable
  • Composer を SHA-384 で署名検証してインストール、pecl 拡張を版固定、set -eux
  • 非 root 実行の UID/GID 実行時マッピングACMS_UID/ACMS_GID)、HEALTHCHECK
  • CI: build.yml(Docker Hub 公開 / provenance / SBOM)、pr-preview.yml(GHCR プレビュー)、lint.yml(actionlint)。Actions は commit SHA でピン留めdependabot 追加

名前空間

  • appleple/acms-dev … 本リポジトリが公開する 実行環境(a-blog cms 非同梱)
  • appleple/acms … 将来の a-blog cms 同梱プロダクトに予約

検証(ローカル実ビルド)

  • 6 バージョン(8.0〜8.5)すべて arm64 でビルド成功、全拡張ロード確認
  • xdebug 既定無効 / ACMS_XDEBUG=true で有効化・opcache 無効化(8.5 静的でも opcache.enable=0
  • UID/GID マッピング(www-data 再割当)・Apache 起動・Composer 動作を確認
  • actionlint 指摘なし / docker buildx bake --print 正常

補足

  • レジストリ移行(atsu666/acmsappleple/acms-dev)の手順書は運用情報を含むためリポジトリ外で保管.gitignoredocs を追加)。
  • 公開には Secrets(DOCKERHUB_USERNAME / DOCKERHUB_TOKEN)の設定が必要。

🤖 Generated with Claude Code

atsu666 and others added 21 commits December 8, 2021 16:07
ブランチごとに Dockerfile を分ける方式から、単一ブランチ + docker-bake.hcl
(PHP_VERSIONS が唯一の版一覧)+ 引数化した 1 枚の Dockerfile へ移行。
wpdev-docker-images の構成を参考にした。

- 対応 PHP: 8.0/8.1/8.2/8.3/8.4/8.5(マルチアーキ amd64/arm64)
- xdebug/pcov を同梱し実行時トグル(ACMS_XDEBUG / -d pcov.enabled=1)。
  -xdebug 専用イメージを廃止
- exif 追加・imagick 復活・Node(nvm) 削除
- PHP 8.5 の OPcache 静的組込みに対応(未ロード時のみ enable)
- Composer をハッシュ検証してインストール、pecl 拡張を版固定、set -eux
- 非 root 実行の UID/GID 実行時マッピング(ACMS_UID/ACMS_GID)、HEALTHCHECK
- CI: build.yml(Docker Hub 公開/provenance/SBOM) / pr-preview.yml(GHCR) /
  lint.yml(actionlint)。Actions は commit SHA でピン留め、dependabot 追加
- 公開先 appleple/acms-dev(実行環境)。appleple/acms は将来の同梱版に予約

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
- ACMS_XDEBUG → XDEBUG
- ACMS_UID / ACMS_GID → PUID / PGID
  (UID/GID は bash の読み取り専用特殊変数のため無印不可。PUID/PGID は
   Docker コミュニティの事実上の標準)

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
- docker-bake.hcl の PHP_VERSIONS に 7.2/7.3/7.4 を追加(計 7.2〜8.5)
- Dockerfile に 7.x 向けの条件分岐を追加
  - 旧 Debian(buster/stretch) は apt ソースを archive.debian.org へ切替
  - gd の configure フラグを PHP 7.4 未満で切替
  - redis を PHP<7.4 で 5.3.7、xdebug を PHP<8.0 で 3.1.6 にフォールバック
  - imagick 3.8.1 / apcu 5.1.28 / pcov 1.0.12 は全バージョン共通
- README の名前空間説明(将来の同梱版)を削除(別リポジトリで公開予定のため)

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
- docker-bake.hcl: PHP_LATEST 8.3 → 8.5
- README: 提供イメージ表の latest 表記を 8.5 に更新

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
- pr-preview.yml: 全部入り multi-arch 1 runner → バージョン別 matrix で並列化。
  PR は amd64 のみ(QEMU を廃止)。arm64 は本番 build.yml で維持。
  対象バージョンは docker-bake.hcl から動的取得(二重管理しない)。
- GHCR 名前空間を ghcr.io/${{ github.repository }} に(リポジトリ改名へ自動追従)。
- OCI ラベル image.source / README を appleple/acms-development-docker-images に更新。

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
- build.yml: バージョン別 matrix で並列化(各ジョブが amd64+arm64 を担当)。
  対象は docker-bake.hcl から動的取得。
- matrix を {version, target} のペアにし、ジョブ表示名を acms-dev:8.5 の形に
  (bake のターゲット名は . 不可のため内部的には acms-dev-8-5)。

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
指摘: entrypoint.sh の usermod -o -u "${PUID}" www-data は、www-data の
ホームディレクトリが /var/www(README 推奨のマウント先 /var/www/html の
親)であるため、一部の shadow-utils 実装では UID 変更時にホーム配下を
自動で再帰 chown する。マウントしたプロジェクト全体が巻き込まれ得る。

検証: 実機で shadow-utils バージョンごとの挙動を確認したところ、本リポジトリ
の対応バージョン中では PHP 7.2(Debian buster, shadow 1:4.5-1.1)でのみ
実際に発生し、/var/www/html 配下のファイルが再帰的に chown されることを
再現した。7.3 以降(bullseye/trixie 系)では発生しない。

対応: Dockerfile で www-data のホームを /nonexistent に切り離す
(usermod -d /nonexistent www-data)。entrypoint.sh は変更不要。
DocumentRoot は Apache 設定ファイルで定義され $HOME に依存しないため、
配信・PUID/PGID マッピングへの影響がないことを実機(HTTP 200 応答、
uid/gid 反映)で確認済み。

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
- bake失敗の可視化: shell:bash明示・エラー抑制解除・空値チェックを追加
  (pipefailで実害はなかったが、エラーメッセージを残すため改善)
- lint.yml: reviewdog(github-check)が要求するchecks:write権限を追加
- entrypoint.sh: DocumentRoot反映をinit.txtガード方式から、ビルド時に退避した
  オリジナル設定(*.orig)からの冪等な再生成方式に変更。再起動のたびに
  APACHE_DOCUMENT_ROOTの最新値が反映される
- 上記sed置換で、値に含まれる sed メタ文字(/ & \)を事前エスケープしクラッシュ
  ・意図しない展開を防止
- build.yml: concurrency グループのキーを github.sha から github.ref に変更
  (push毎に一意なshaでは cancel-in-progress が機能しなかった)
- Dockerfile: --no-install-recommends 化で失われていた openssh-client を追加
  (git+ssh clone がコンテナ内で失敗する問題を修正)
- entrypoint.sh: apache2 を entrypoint プロセスの exec で置き換え、PID1にする。
  apache がクラッシュ/OOM-killされた場合にコンテナ自体が終了し、
  restart ポリシーで正しく自動復旧できるようになる
- README: compose 例から不要な privileged: true を削除
- pr-preview.yml 用に GHCR プレビュータグの自動削除ワークフロー
  (pr-cleanup.yml) を追加。削除には delete:packages 権限の PAT
  (GHCR_DELETE_TOKEN) が必要なため、未設定時は警告のみで安全にスキップ
- README: pcov.ini がビルド時にイメージへ焼き込まれ、取得済みイメージには
  反映されない旨を明記
- docker-bake.hcl: PR プレビュー時に未文書化の latest-<PR番号> タグが
  公開されてしまう問題を修正(本番公開時のみ latest を付与)
- README: 443番ポートはSSL未設定のため動作しない旨を明記し、compose例から削除
- Dockerfile: 全対応バージョンで静的組込み済みの mbstring の再ビルドと、
  docker-php-ext-install が内部で自動実行する enable の重複呼び出しを削除
- Dockerfile: 公式PHPイメージと同じ apt-mark パターンでビルド専用パッケージ
  (build-essential・*-dev ヘッダ)を除去。自前ビルドした拡張(.so)が実際に
  リンクする共有ライブラリは ldd で検出し保護(Debian の /lib→/usr/lib
  symlinkを readlink -f で解決してから dpkg-query に渡す)。
  イメージサイズを平均で 250〜350MB 削減

全9バージョン(7.2〜8.5)で再ビルドし、拡張ロード・PID1化・DocumentRoot
冪等性・sed安全性・PUID/PGID・XDEBUGトグル・HEALTHCHECK・CLIツール生存
(git/ssh/python/sendmail等)を実機検証済み。

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@uidev1116 uidev1116 merged commit 5c18e0a into master Jul 3, 2026
12 checks passed
@uidev1116 uidev1116 deleted the feature/unified-docker-images branch July 3, 2026 09:44
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.

2 participants