specsfy-specialist-docker について
コンテナイメージやローカル・CI の Compose 設定を構築、レビューする開発者向けの Docker スキルです。再現可能なビルド、実行時の挙動、イメージの整理、コンテナのセキュリティ対策を扱います。
主な機能
- 01Dockerfile と Compose の指針
- 02イメージ構築とサイズの改善
- 03実行状態とシグナル処理
- 04コンテナのセキュリティ対策
- 05ビルドと実行時の検証
活用シーン
- 01起動しないコンテナの調査
- 02イメージの縮小や漏えいした秘密情報の除去
- 03ヘルスチェックと正常終了の確認
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ promovaweb/ specsfy --skill specsfy-specialist-dockerインストール後、Claude Code で/specsfy-specialist-dockerを入力して読み込まれたか確認します。
同梱ファイルagents/openai.yamlreferences/standards.md
詳細
Docker
使用するタイミング
Dockerfile、docker-compose.yml、.dockerignore、タグ/レジストリのポリシーを記述またはレビューするとき、あるいはコンテナーがビルドできない、起動しない、ヘルスチェックに応答しない問題をデバッグするときに使用します。- イメージサイズの縮小、レイヤーに漏えいしたシークレットの除去、
SIGTERMを正しく受信しないプロセスの修正にも使用します。 - マルチノードのオーケストレーション、レプリカを使ったロールアウト、クラスターシークレット、オーバーレイネットワークには使用せず、その場合は
$specsfy-specialist-docker-swarmを使用します。ここでの Docker Compose はローカル/CI 環境向けであり、マルチホストの本番トポロジー向けではありません。 - サプライチェーン(SBOM、来歴、脆弱な依存関係)のレビューでは
$specsfy-specialist-application-securityと、ビルド内容そのものについてはプロジェクトの言語/フレームワークのスキルと組み合わせます。
手順
- 変更を提案する前に、対象アーキテクチャ(amd64/arm64)、ベースランタイム(言語、バージョン)、実際のビルドコンテキスト、想定される実行契約(変数、ポート、ボリューム)を確認します。
Dockerfile、.dockerignore、docker-compose.yml、プロジェクトで現在使用されているイメージ/タグのポリシーを調査します。- イメージがリリースまたはデプロイに含まれる場合は、この手順を
$specsfy-specialist-deployのもとで実施します。$specsfy-specialist-versioningから提供されたバージョンを使用し、docker-tagで参照を生成して、verify-docker-tagが差異を指摘した場合は拒否します。 - ステージを明確にしてビルド依存関係とランタイム依存関係を分離します(
multi-stage build)。最終イメージには、本番環境で実行されないコンパイラー、パッケージキャッシュ、ソースを含めないでください。 - アーティファクトを再現可能な方法で固定し(ロックファイル、固定バージョンまたはダイジェストによるベースイメージ)、ビルドコンテキストと変更可能なレイヤーを減らします。
- root 以外のユーザーでプロセスを実行し、権限を制限し(
cap_drop、--privilegedを使わない)、イメージにシークレットを埋め込まないでください。 - ヘルスチェック、シグナル処理(
SIGTERM、SIGINT)、ボリューム、ネットワーク、外部設定(env、マウントされたファイル)を明示的に定義します。 - イメージをビルドして脆弱性をスキャンし、本番環境での実行方法とまったく同じ条件(同じユーザー、同じ変数)でテストします。
ベストプラクティス
- ネイティブ拡張を含むアプリケーションでは、コンパイルをファミリーごとに独立したステージに分割します。Redis、メディア、アプリケーションサーバーの変更によって、ツールチェーン全体を無効にする必要はありません。
- 複数のサービスで同じコードを使う場合は、単一のイメージを作成し、エントリーポイントで HTTP、スケジューラー、キュー、WebSocket などのプロセスモードを選択します。各モードには、その役割に適したヘルスチェック、シグナル処理、書き込み方法を設定します。
- SemVer とコミットの不変な参照を公開し、どちらもまだ存在しないことを確認して、デプロイで使用したダイジェストを記録します。Git タグの公開は、イメージがレジストリで利用可能になってから行います。
- フレームワークのキャッシュがランタイムで提供される設定に依存する場合は、エントリーポイントで生成します。異なる値を使う環境に、ビルド中に作成した設定キャッシュを持ち込まないでください。
- 互換性のある最小限のベースイメージを優先します(スタックが対応していれば slim/alpine)。バイト単位での再現性が自動的なパッチ更新より重要な場合は、ダイジェスト(
@sha256:...)で固定します。 - キャッシュを最大限活用できるように命令を並べます(ソースコードより先に依存関係)。ただし、依存関係の更新を妨げないようにします。
COPY package*.jsonの後にRUN installを実行してからCOPY . .を行うと、コード変更時にもインストールをキャッシュしつつ、インストールされるバージョンを固定せずに済みます。 - ビルド時の認証情報やパッケージマネージャーのキャッシュには、BuildKit のシークレットおよびキャッシュマウント(
RUN --mount=type=secret、--mount=type=cache)を使います。シークレットにARG/ENVは決して使わないでください。どちらも最終イメージのレイヤー履歴に残ります。 .dockerignoreを使わずにリポジトリ全体をコピーしないでください。.git、node_modules、ローカルのビルド成果物、.envがビルドコンテキストに漏れ、イメージのサイズやビルド時間が増加します。- メインプロセスを PID 1 として扱うことを意識します。シグナルを正しく受け取るには、exec 形式の
ENTRYPOINT(シェル形式のCMD cmd argsではなく["cmd"])を使うか、プロセスがゾンビを回収しない場合は最小限の init(--init/tini)を使います。 - 永続データはコンテナの書き込み可能レイヤーの外に保持します(名前付きボリュームまたはバインドマウント)。コンテナのレイヤー内のデータは、コンテナとともに失われます。
- ワークロードが対応する場合は、リソース制限と読み取り専用のルートファイルシステム(
--read-onlyと、書き込みが必要な箇所への明示的なボリューム)を設定し、ランタイムの攻撃対象領域を縮小します。
アンチパターン
- 本番環境で唯一のタグとして
latestを使うこと。再現性がなく、コンテナを調べないと実行中のコードを特定できません。 - ローカルファイルのコピーに
COPYではなくADDを使うこと。ADDはファイルの展開や URL の取得も行うため、暗黙の動作となり、後から Dockerfile を読む人を戸惑わせます。 - トラフィックを処理するイメージで、
USERを指定せず暗黙にUSER rootのままにすること。コンテナ内で侵害されたプロセスがコンテナの root 権限を持ち、アプリケーションの脆弱性による影響が拡大します。 - マルチステージビルドを使わず、コンパイラーやヘッダーなどのビルド依存関係を最終レイヤーにインストールすること。ランタイムでメリットがないままイメージが肥大化し、スキャン対象となる脆弱性の範囲も広がります。
- クリティカルな依存関係(データベース、キュー)を確認せず、「プロセスがポートで待ち受けている」ことだけを調べるヘルスチェック。実際にはリクエストを処理できなくても、オーケストレーターはコンテナを正常と判断します。
検証
- キャッシュなしのクリーンビルド(
--no-cache)と、キャッシュを使った増分ビルドの両方で、機能的に同等のイメージが生成されることを確認します。 - 開発用のデフォルト設定だけでなく、対象環境で実際に使用するユーザー、アーキテクチャ、環境変数でイメージを実行します。
- ヘルスチェック、
docker stop(設定した猶予時間内での正常なシャットダウン)、公開ポート、ボリューム、内部 DNS 解決、宣言された依存関係が利用できない場合の挙動を検証します。 - SBOM を生成し、プロジェクトで利用可能な脆弱性スキャナーを実行して、最終イメージのサイズとレイヤー数を確認します。
- スキャナーを実行していないのにイメージを「安全」と宣言したり、同じコミットからのビルドを繰り返して機能的に同じ結果が得られていないのに「再現可能」と宣言したりしないでください。
関連するスキル
-
$specsfy-specialist-server-reportは、Ansible による読み取り専用の収集で、ホストごとのレポートにログ、サービス、ディスク使用量をまとめます。 -
$specsfy-specialist-deployは完全なデリバリーを調整します。このスキルが扱うのはイメージと開発用 Compose のみです。 -
$specsfy-specialist-versioningはSEMVERを準備し、公開前にイメージの識別情報を確認します。 -
$specsfy-specialist-docker-swarmは、マルチノードオーケストレーション、クラスターシークレット、オーバーレイネットワーク、サービスのロールアウトを扱います。このスペシャリストが対象とするのはイメージとローカル Compose であり、本番クラスターではありません。 -
$specsfy-specialist-application-securityは、サプライチェーン(SBOM、来歴、依存関係の CVE)と、コンテナ以外のセキュリティ強化を扱います。 -
$specsfy-specialist-observabilityは、コンテナ内のプロセスのログ、メトリクス、トレーシングを扱います。 -
$specsfy-specialist-postgres、$specsfy-specialist-redisは、イメージ/サービス内で動作するもの(スキーマ設計、データ構造、永続化)を扱います。このスキルが扱うのはパッケージング(公式イメージ、ボリューム、ヘルスチェック)であり、データベース/キャッシュ内部の設計判断ではありません。 -
プロジェクトのローカル環境が Docker 上の Supabase CLI によってオーケストレーションされている場合は、
$specsfy-specialist-supabaseを使用します。 -
$specsfy-specialist-laravelは、パッケージ化されたアプリケーションの実行時の契約(キューワーカー、スケジューラー、想定される環境変数)を扱います。 -
$specsfy-specialist-debian-serverは、イメージを実行するホストのカーネル、ファイルシステム、systemd、APT、Docker Engine を扱います。
ビルド、Compose、セキュリティ、サプライチェーン、運用については、references/standards.md をお読みください。