Yuki Takei 1 месяц назад
Родитель
Сommit
ef08c017c3

+ 63 - 1
.kiro/specs/official-docker-image/design.md

@@ -194,14 +194,19 @@ flowchart LR
 | 6.7 | フラグログ出力 | docker-entrypoint.ts | console.log | Entrypoint フロー |
 | 6.8 | TypeScript で記述 | docker-entrypoint.ts | Node.js type stripping | — |
 | 7.1-7.5 | 後方互換性 | 全コンポーネント | — | — |
+| 8.1 | docker-new → docker 置換 | ディレクトリ構造 | ファイルシステム | — |
+| 8.2 | Dockerfile パス参照更新 | Dockerfile | — | — |
+| 8.3 | DHI レジストリログイン | buildspec.yml | secrets-manager | Build フロー |
+| 8.4 | buildspec Dockerfile パス確認 | buildspec.yml | — | Build フロー |
 
 ## Components and Interfaces
 
 | Component | Domain/Layer | Intent | Req Coverage | Key Dependencies | Contracts |
 |-----------|-------------|--------|-------------|-----------------|-----------|
-| Dockerfile | Infrastructure | Docker イメージビルド定義 | 1.1-1.5, 3.1-3.5, 4.1-4.5, 5.1-5.3, 6.5 | DHI images (P0), turbo (P0), pnpm (P0) | — |
+| Dockerfile | Infrastructure | Docker イメージビルド定義 | 1.1-1.5, 3.1-3.5, 4.1-4.5, 5.1-5.3, 6.5, 8.2 | DHI images (P0), turbo (P0), pnpm (P0) | — |
 | docker-entrypoint.ts | Infrastructure | コンテナ起動時の初期化(TypeScript) | 2.1-2.7, 6.1-6.4, 6.6-6.8 | Node.js fs/child_process (P0), cgroup fs (P1) | Batch |
 | Dockerfile.dockerignore | Infrastructure | ビルドコンテキストフィルタ | 4.3 | — | — |
+| buildspec.yml | CI/CD | CodeBuild ビルド定義 | 8.3, 8.4 | AWS Secrets Manager (P0), dhi.io (P0) | Batch |
 
 ### Infrastructure Layer
 
@@ -504,3 +509,60 @@ entrypoint は try-catch で各フェーズのエラーを捕捉。致命的エ
 - **ビルドキャッシュ**: `turbo prune --docker` により dependency install レイヤーをキャッシュ。ソースコード変更時の再ビルドで依存インストールをスキップ
 - **イメージサイズ**: DHI runtime に追加バイナリなし。node:24-slim 比でベースレイヤーが縮小
 - **メモリ効率**: `--max-heap-size` による total heap 制御で、v24 の trusted_space overhead 問題を回避。マルチテナントでのメモリ圧迫を防止
+
+## Phase 3: 本番置換と CI/CD 対応
+
+### ディレクトリ置換
+
+`apps/app/docker-new/` の成果物を `apps/app/docker/` に移動し、旧ファイルを削除する。
+
+**置換対象:**
+
+| 操作 | ファイル | 備考 |
+|------|---------|------|
+| 削除 | `apps/app/docker/Dockerfile` | 旧 3 ステージ Dockerfile(node:20-slim) |
+| 削除 | `apps/app/docker/docker-entrypoint.sh` | 旧 shell entrypoint(gosu 使用) |
+| 削除 | `apps/app/docker/Dockerfile.dockerignore` | 旧 dockerignore |
+| 移動 | `docker-new/Dockerfile` → `docker/Dockerfile` | 新 5 ステージ DHI Dockerfile |
+| 移動 | `docker-new/docker-entrypoint.ts` → `docker/docker-entrypoint.ts` | 新 TypeScript entrypoint |
+| 移動 | `docker-new/docker-entrypoint.spec.ts` → `docker/docker-entrypoint.spec.ts` | テストファイル |
+| 移動 | `docker-new/Dockerfile.dockerignore` → `docker/Dockerfile.dockerignore` | 新 dockerignore |
+| 維持 | `apps/app/docker/codebuild/` | CodeBuild 設定(変更なし) |
+| 維持 | `apps/app/docker/README.md` | Docker Hub README |
+
+**パス参照の更新:**
+- Dockerfile line 122: `apps/app/docker-new/docker-entrypoint.ts` → `apps/app/docker/docker-entrypoint.ts`
+
+**影響を受けない既存参照(コードベース調査済み):**
+- `buildspec.yml`: `-f ./apps/app/docker/Dockerfile` — パスは同一のまま
+- `codebuild.tf`: `buildspec = "apps/app/docker/codebuild/buildspec.yml"` — 同一
+- `.github/workflows/release.yml`: `./apps/app/docker/README.md` — 同一
+- `.github/workflows/ci-app.yml`: `!apps/app/docker/**` 除外パターン — 同一
+- `apps/app/bin/github-actions/update-readme.sh`: `cd docker` — 同一
+
+### buildspec.yml の DHI レジストリ認証
+
+DHI イメージの pull に `docker login dhi.io` が必要。[DHI ドキュメント](https://docs.docker.com/dhi/how-to/use/)によると、DHI は Docker Hub 認証情報を使用する。
+
+**現行 buildspec.yml:**
+```yaml
+phases:
+  pre_build:
+    commands:
+      - echo ${DOCKER_REGISTRY_PASSWORD} | docker login --username growimoogle --password-stdin
+```
+
+**更新後:**
+```yaml
+phases:
+  pre_build:
+    commands:
+      # login to docker.io (for push)
+      - echo ${DOCKER_REGISTRY_PASSWORD} | docker login --username growimoogle --password-stdin
+      # login to dhi.io (for DHI base image pull)
+      - echo ${DOCKER_REGISTRY_PASSWORD} | docker login dhi.io --username growimoogle --password-stdin
+```
+
+- Docker Hub と同一の認証情報を使用(DHI は Docker Hub アカウントで認証)
+- 既存の `DOCKER_REGISTRY_PASSWORD` シークレットを再利用
+- `secretsmanager.tf` の変更は不要

+ 11 - 0
.kiro/specs/official-docker-image/requirements.md

@@ -119,3 +119,14 @@ GROWI 公式 Docker イメージの Dockerfile (`apps/app/docker/Dockerfile`) 
 3. The Docker イメージ shall ポート 3000 でリッスンする現行動作を維持する
 4. While メモリ管理の環境変数(`GROWI_HEAP_SIZE`、`GROWI_OPTIMIZE_MEMORY`、`GROWI_LITE_MODE`)が未設定の場合, the Docker イメージ shall 既存の動作(Node.js 24 のデフォルト)と実質的に同等に動作する
 5. The Docker イメージ shall `docker-compose.yml` / `compose.yaml` からの利用パターンを維持する
+
+### Requirement 8: 本番置換と CI/CD 対応
+
+**Objective:** As an インフラ管理者, I want docker-new ディレクトリの成果物が既存の docker ディレクトリを正式に置き換え、CI/CD パイプラインが新しい Dockerfile で動作すること, so that 本番ビルドで DHI ベースのイメージが使用される
+
+#### Acceptance Criteria
+
+1. The Docker ビルド構成 shall `apps/app/docker-new/` の全ファイル(`Dockerfile`、`docker-entrypoint.ts`、`docker-entrypoint.spec.ts`、`Dockerfile.dockerignore`)を `apps/app/docker/` に移動し、旧ファイル(旧 `Dockerfile`、`docker-entrypoint.sh`、旧 `Dockerfile.dockerignore`)を削除する。`codebuild/` ディレクトリと `README.md` は維持する
+2. The Dockerfile shall ファイル内の自己参照パス `apps/app/docker-new/docker-entrypoint.ts` を `apps/app/docker/docker-entrypoint.ts` に更新する
+3. The buildspec.yml shall DHI レジストリ(`dhi.io`)へのログインコマンドを pre_build フェーズに追加する。DHI は Docker Hub 認証情報を使用するため、既存の `DOCKER_REGISTRY_PASSWORD` シークレットを再利用する
+4. The buildspec.yml shall 新しい Dockerfile のパス(`./apps/app/docker/Dockerfile`)を正しく参照する(現行パスと同一のため変更不要であることを確認する)

+ 36 - 0
.kiro/specs/official-docker-image/research.md

@@ -185,6 +185,42 @@
 - **Trade-offs**: CMD が不要になる(entrypoint が全ての起動処理を行う)。docker run でのコマンド上書きが entrypoint 内のロジックには影響しない
 - **Follow-up**: なし
 
+### DHI レジストリ認証と CI/CD 統合
+
+- **Context**: DHI ベースイメージの pull に必要な認証方式と、既存 CodeBuild パイプラインへの統合方法を調査
+- **Sources Consulted**:
+  - [DHI How to Use an Image](https://docs.docker.com/dhi/how-to/use/) — DHI の利用手順
+  - 既存 `apps/app/docker/codebuild/buildspec.yml` — 現行の CodeBuild ビルド定義
+  - 既存 `apps/app/docker/codebuild/secretsmanager.tf` — AWS Secrets Manager 設定
+- **Findings**:
+  - DHI は Docker Hub 認証情報を使用(DHI は Docker Business/Team サブスクリプションの機能)
+  - `docker login dhi.io --username <dockerhub-user> --password-stdin` で認証可能
+  - 既存 buildspec.yml は `DOCKER_REGISTRY_PASSWORD` シークレットで docker.io にログイン済み
+  - 同じ認証情報で `dhi.io` にもログイン可能(追加シークレットは不要)
+  - CodeBuild の `reusable-app-build-image.yml` → CodeBuild Project → buildspec.yml の流れは変更不要
+- **Implications**:
+  - buildspec.yml の pre_build に `docker login dhi.io` を 1 行追加するだけで対応可能
+  - `secretsmanager.tf` の変更は不要
+  - Docker Hub と DHI の両方にログインが必要(docker.io は push 用、dhi.io は pull 用)
+
+### ディレクトリ置換の影響範囲(コードベース調査)
+
+- **Context**: `apps/app/docker-new/` → `apps/app/docker/` への置換時に、既存の参照が壊れないことを確認
+- **Sources Consulted**: コードベース全体を `apps/app/docker` キーワードで grep 調査
+- **Findings**:
+  - `buildspec.yml`: `-f ./apps/app/docker/Dockerfile` — 置換後も同一パス(変更不要)
+  - `codebuild.tf`: `buildspec = "apps/app/docker/codebuild/buildspec.yml"` — 同一(変更不要)
+  - `.github/workflows/release.yml`: `readme-filepath: ./apps/app/docker/README.md` — 同一(変更不要)
+  - `.github/workflows/ci-app.yml` / `ci-app-prod.yml`: `!apps/app/docker/**` 除外パターン — 同一(変更不要)
+  - `apps/app/bin/github-actions/update-readme.sh`: `cd docker` + sed — 同一(変更不要)
+  - Dockerfile 内: line 122 `apps/app/docker-new/docker-entrypoint.ts` — **要更新**(自己参照パス)
+  - `package.json` や `vitest.config` に docker 関連の参照 — なし
+  - `lefthook.yml` に docker 関連フック — なし
+- **Implications**:
+  - 置換時に更新が必要なのは Dockerfile 内の自己参照パス 1 箇所のみ
+  - 外部参照(CI/CD、GitHub Actions)は全て `apps/app/docker/` パスを使用しており変更不要
+  - `codebuild/` ディレクトリと `README.md` は `docker/` 内にそのまま維持
+
 ## Risks & Mitigations
 
 - **Node.js 24 TypeScript ネイティブ実行の安定性**: type stripping は Node.js 23 で unflag 済み。Node.js 24 では安定機能。ただし enum 等の非 erasable syntax は使用不可 → interface/type のみ使用

+ 5 - 5
.kiro/specs/official-docker-image/spec.json

@@ -1,9 +1,9 @@
 {
   "feature_name": "official-docker-image",
   "created_at": "2026-02-20T00:00:00.000Z",
-  "updated_at": "2026-02-20T14:05:00.000Z",
+  "updated_at": "2026-02-20T15:30:00.000Z",
   "language": "ja",
-  "phase": "implemented",
+  "phase": "design-generated",
   "approvals": {
     "requirements": {
       "generated": true,
@@ -11,12 +11,12 @@
     },
     "design": {
       "generated": true,
-      "approved": true
+      "approved": false
     },
     "tasks": {
       "generated": true,
-      "approved": true
+      "approved": false
     }
   },
-  "ready_for_implementation": true
+  "ready_for_implementation": false
 }