# バッチ設計書 48-Dockerfile

## 概要

本ドキュメントは、Dockerfileのバッチ設計書である。mrubyプロジェクトのテスト・品質管理実行環境として、Ruby、pre-commit、shellcheck等のツールを含むDockerコンテナイメージをビルドする定義について記載する。

### 本バッチの処理概要

本Dockerfileは、ruby:3.2.2-bullseyeをベースイメージとして、mrubyのビルド・テスト・品質管理に必要なツール群（Ruby、pre-commit、shellcheck）を含むDockerコンテナイメージを構築する。

**業務上の目的・背景**：mrubyの開発・テスト環境を統一し、開発者間での環境差異による問題を排除するため、Dockerコンテナを使用した再現可能なテスト環境を提供する。これにより、ローカル環境やCI環境で一貫したテスト実行が可能となる。pre-commitフックの実行環境も含むため、コード品質管理の自動化にも活用される。

**バッチの実行タイミング**：docker buildコマンドの実行時、またはdocker-compose build時に実行される。

**主要な処理内容**：
1. ruby:3.2.2-bullseyeベースイメージからコンテナを構築する
2. python3-pipとshellcheckをaptでインストールする
3. GemfileとGemfile.lockからbundle installでRuby依存パッケージをインストールする
4. pip3でpre-commitをインストールし、git init後にpre-commitフックをセットアップする
5. プロジェクト全体をコンテナにコピーする

**前後の処理との関連**：本Dockerfileはdocker-compose.yml（No.49）のbuild contextとして使用される。構築されたイメージはdocker-composeによるテスト実行（No.31: rake composetest）や品質管理（No.30: rake composecheck）に使用される。

**影響範囲**：Dockerコンテナ環境でのmrubyビルド・テスト実行。docker-compose経由での全てのコンテナ操作に影響する。

## バッチ種別

環境構築 / コンテナイメージビルド

## 実行スケジュール

| 項目 | 内容 |
|-----|------|
| 実行頻度 | 随時（手動実行） |
| 実行時刻 | 該当なし |
| 実行曜日 | 該当なし |
| 実行日 | 該当なし |
| トリガー | docker build / docker-compose build コマンド実行時 |

## 実行条件

### 前提条件

| 条件 | 説明 |
|-----|------|
| Docker環境 | Docker Engineがインストールされ動作可能であること |
| ネットワーク接続 | ベースイメージのプル、apt/pip/bundlerパッケージのダウンロードのためインターネット接続が必要 |
| Gemfile | プロジェクトルートにGemfileとGemfile.lockが存在すること |
| .pre-commit-config.yaml | プロジェクトルートに.pre-commit-config.yamlが存在すること |

### 実行可否判定

docker buildコマンドまたはdocker-compose buildコマンドの実行により開始される。Dockerデーモンが稼働していることが前提条件。

## 入力仕様

### 入力パラメータ

| パラメータ名 | 型 | 必須 | デフォルト値 | 説明 |
|-------------|-----|-----|-------------|------|
| ベースイメージ | string | Yes | ruby:3.2.2-bullseye | Dockerベースイメージ |

### 入力データソース

| データソース | 形式 | 説明 |
|-------------|------|------|
| Gemfile | Ruby Gemfile | Rubyパッケージの依存関係定義 |
| Gemfile.lock | Ruby Gemfile.lock | パッケージのバージョンロックファイル |
| .pre-commit-config.yaml | YAML | pre-commitフックの設定ファイル |
| プロジェクトソースコード | ファイルシステム | mrubyソースコード全体 |

## 出力仕様

### 出力データ

| 出力先 | 形式 | 説明 |
|-------|------|------|
| Dockerイメージ | Docker Image | ビルドされたコンテナイメージ |

### 出力ファイル仕様

本Dockerfileはコンテナイメージとして出力される。

| 項目 | 内容 |
|-----|------|
| ファイル名 | Dockerイメージ（タグはdocker buildのオプションで指定） |
| 出力先 | ローカルDockerイメージストア |
| 文字コード | 該当なし |
| 区切り文字 | 該当なし |

## 処理フロー

### 処理シーケンス

```
1. ベースイメージ取得
   └─ FROM ruby:3.2.2-bullseyeでDebianベースのRuby 3.2.2イメージを使用
2. システムパッケージインストール
   ├─ apt-get updateでパッケージリストを更新
   ├─ python3-pipとshellcheckをインストール（--no-install-recommends）
   ├─ apt-get cleanでキャッシュを削除
   └─ /var/lib/apt/lists/*を削除してイメージサイズを削減
3. 作業ディレクトリ設定
   └─ WORKDIR /appを設定
4. 依存関係ファイルコピー
   └─ Gemfile、Gemfile.lock、.pre-commit-config.yamlをコピー
5. 依存関係インストール
   ├─ bundle installでRuby gemをインストール
   ├─ pip3 install pre-commitでpre-commitをインストール（--no-cache-dir）
   ├─ git init .で一時的なgitリポジトリを初期化
   └─ pre-commit install-hooksでフックをセットアップ
6. プロジェクトコピー
   └─ COPY . .でプロジェクト全体をコンテナにコピー
```

### フローチャート

```mermaid
flowchart TD
    A[docker build開始] --> B[FROM ruby:3.2.2-bullseye]
    B --> C[apt-get install<br>python3-pip, shellcheck]
    C --> D[WORKDIR /app]
    D --> E[COPY Gemfile等の依存関係ファイル]
    E --> F[bundle install]
    F --> G[pip3 install pre-commit]
    G --> H[git init && pre-commit install-hooks]
    H --> I[COPY . . <br>プロジェクト全体コピー]
    I --> J[イメージビルド完了]
```

## データベース操作仕様

### 操作別データベース影響一覧

本Dockerfileはデータベース操作を行わない。

| 処理 | 対象テーブル | 操作種別 | 概要 |
|-----|-------------|---------|------|
| 該当なし | 該当なし | 該当なし | 該当なし |

### テーブル別操作詳細

該当なし。

## エラー処理

### エラーケース一覧

| エラーコード | エラー種別 | 発生条件 | 対処方法 |
|------------|----------|---------|---------|
| - | ベースイメージ取得失敗 | Dockerレジストリへのアクセスに失敗した場合 | ネットワーク接続を確認し再実行する |
| - | apt-getインストール失敗 | パッケージのインストールに失敗した場合 | パッケージリポジトリの状態を確認する |
| - | bundle install失敗 | Gemfile/Gemfile.lockに問題がある場合 | Gemfileの依存関係を確認・修正する |
| - | pip3インストール失敗 | pre-commitのインストールに失敗した場合 | Python/pipの状態を確認する |
| - | pre-commit install-hooks失敗 | フックのセットアップに失敗した場合 | .pre-commit-config.yamlの設定を確認する |

### リトライ仕様

| 項目 | 内容 |
|-----|------|
| リトライ回数 | 手動で再実行（docker buildコマンド） |
| リトライ間隔 | 該当なし（手動） |
| リトライ対象エラー | ネットワーク関連の一時的なエラー |

### 障害時対応

ビルド失敗時はdocker buildの出力ログから失敗したステップを特定し、原因に応じて対処する。ネットワーク起因の場合は再実行する。パッケージバージョンの問題の場合はDockerfileまたはGemfileを修正する。

## トランザクション仕様

| 項目 | 内容 |
|-----|------|
| トランザクション範囲 | Dockerレイヤー単位（各命令がレイヤーとして保存） |
| コミットタイミング | 各Docker命令の完了時 |
| ロールバック条件 | ビルド失敗時は途中レイヤーまでキャッシュされ、再実行時にキャッシュが活用される |

## パフォーマンス要件

| 項目 | 内容 |
|-----|------|
| 想定処理件数 | 1イメージのビルド |
| 目標処理時間 | 明示的な規定なし（初回ビルドは数分、キャッシュ利用時は高速） |
| メモリ使用量上限 | Docker Engineの設定に依存 |

## 排他制御

docker buildは単一プロセスとして実行される。同時に複数のdocker buildが同一Dockerfileに対して実行された場合、Dockerのビルドキャッシュ機構により適切に処理される。

## ログ出力

| ログ種別 | 出力タイミング | 出力内容 |
|---------|--------------|---------|
| 開始ログ | ビルド開始時 | ビルドコンテキスト情報、ベースイメージ情報 |
| 進捗ログ | 各ステップ実行時 | パッケージインストール進捗、COPY処理進捗 |
| 終了ログ | ビルド完了時 | イメージID、イメージサイズ |
| エラーログ | エラー発生時 | 失敗したステップの詳細エラーメッセージ |

## 監視・アラート

| 監視項目 | 閾値 | アラート先 |
|---------|-----|----------|
| イメージビルド失敗 | 1回 | ビルド実行者（手動実行のため） |
| イメージサイズ | 明示的な規定なし | 該当なし |

## 備考

- ベースイメージはruby:3.2.2-bullseye（Debian Bullseyeベース）
- `--no-install-recommends`オプションにより最小限のパッケージのみインストールしてイメージサイズを削減
- `apt-get clean`と`rm -rf /var/lib/apt/lists/*`によりキャッシュを削除してイメージサイズを最適化
- pip3は`--no-cache-dir`オプションでキャッシュなしインストール
- Gemfile等を先にCOPYし、依存関係インストール後にプロジェクト全体をCOPYするマルチステージ戦略により、Dockerキャッシュの効率が向上する
- pre-commitのフックインストールのために一時的にgit initが実行される
- コンテナの作業ディレクトリは/app
