メインコンテンツまでスキップ

Docker: テスト、開発、デプロイ

再現性のあるテスト、Go 不要のフロントエンド開発、本番デプロイ、CI での自動 Skill 検証に Docker を使用します。

モード選択図

コマンド対応表:

コマンドmisemake
テスト(オフライン)mise run test:dockermake test-docker
テスト(オンライン)mise run test:docker:onlinemake test-docker-online
Playground(起動 + シェル)mise run playgroundmake playground
Playground(停止)mise run playground:downmake playground-down
Sandbox(上級)./scripts/sandbox.sh <up|down|shell|reset|status|logs|bare>
Devcontainer(起動 + シェル)mise run devcmake devc
Devcontainer(起動のみ)mise run devc:upmake devc-up
Devcontainer(停止)mise run devc:downmake devc-down
Devcontainer(再起動)mise run devc:restartmake devc-restart
Devcontainer(完全リセット)mise run devc:resetmake devc-reset
Devcontainer(ステータス)mise run devc:statusmake devc-status
Dev API サーバーmise run dev:dockermake dev-docker
Dev 停止mise run dev:docker:downmake dev-docker-down
Docker ビルドmise run docker:buildmake docker-build
Docker マルチアーキmise run docker:build:multiarchmake docker-build-multiarch

用途

モード最適な用途ネットワークライフサイクル
オフラインテストサンドボックス安定したリグレッションチェック(build + unit + integration無効ワンショット
オンラインテストサンドボックス任意のリモートインストール/更新チェック有効ワンショット
インタラクティブプレイグラウンド手動でのコマンド探索やデモ有効永続
Dev プロファイルDocker 上の Go API サーバー + ホスト上の Vite HMR有効永続
DevcontainerVS Code / Codespaces ワンクリック開発環境有効永続
本番イメージ軽量デプロイ(docker/production/有効永続
CI イメージパイプラインでの Skill 検証(docker/ci/有効ワンショット

よくあるシナリオ

1. ローカルのインストール/更新ロジックを確定的に検証する

install / update の挙動を変更していて、CI と同等のローカルゲートが欲しいときに使います。

mise run test:docker
make test-docker

これはローカルパスと file:// のワークフローを分離した状態で検証します。

2. 任意のリモートソースチェックを実行する

ネットワークアクセスに依存する GitHub / リモートソースの検証に使います。

make test-docker-online

3. 専用プレイグラウンドを開いてすべてのコマンドを探索する

プレイグラウンドを起動して入るコマンドは1つだけです。

make playground
mise run playground

プレイグラウンド内では skillsharess がすぐに使えます。Global mode と Project mode の両方が事前に初期化済みです。

skillshare --help
ss status
skillshare list

プレイグラウンドでの Project Mode

プレイグラウンドはサンプル Skill と claude Target を含むデモプロジェクトを ~/demo-project に自動でセットアップします。すぐに Project mode の探索を始められます。

cd ~/demo-project
skillshare status # Project mode を自動検出
skillshare list
skillshare sync --dry-run

Web ダッシュボードを起動するには、組み込みのエイリアスを使います。

skillshare-ui            # Global mode ダッシュボード → http://localhost:19420
skillshare-ui-p # Project mode ダッシュボード (~/demo-project) → http://localhost:19420

その後、ホストマシンで http://localhost:19420 を開いてください(ポートは Docker Compose 経由でマッピングされています)。

GitHub トークン(検索用)

プレイグラウンドは skillshare search 用の GitHub トークンをホストから自動的に取得します。$GITHUB_TOKEN$GH_TOKENgh auth token の順にチェックします。ホストで既に認証済みであれば追加設定は不要です。

# 検出されない場合は、プレイグラウンド起動前に設定してください:
export GITHUB_TOKEN=ghp_your_token_here
make playground

終了時:

make playground-down

役割別のユースケース

個人開発者

シナリオ使うもの何の代わりになるか
Go/Node をインストールせずに skillshare を試すdocker run ghcr.io/runkids/skillshareGo + Node + pnpm をインストールしてソースからビルド
PR を出す前にフルテストスイートを実行するmake test-dockerローカルツールチェーンに依存する(Go バージョンの不一致でテスト結果が不安定になる)
Go 未インストールでのフロントエンド作業make dev-docker + cd ui && pnpm run devAPI サーバーを動かすためにローカルに Go 1.25+ をインストールする必要がある
同僚に skillshare をデモするmake playground:19420 の Web UIフルローカルインストールの手順を一通り説明する
Apple Silicon 上で Linux の挙動を検証するmake docker-buildCI にプッシュして待つ

チームとオープンソースの貢献者

シナリオ使うもの何を解決するか
新規コントリビューターのオンボーディングmake playground — コマンド1つで準備完了「Go をインストール、PATH を設定、clone、build」というセットアップガイドが不要に
CI での自動 Skill 品質ゲートdocker run ghcr.io/.../skillshare-ci audit /skills以前はワークフローごとに Go のインストール + ソースビルドが必要だった
コントリビューター間の「自分の環境では動く」問題Docker が Go 1.25.5 + すべての依存関係を固定ローカルの Go バージョンの違いによるテストの不安定化
PR レビュアーによる問題の再現./scripts/test_docker.sh --cmd "go test -run TestXxx ..."再現するには clone + フルローカルセットアップが必要だった

エンタープライズおよびセルフホストデプロイ

シナリオ使うもの価値
社内 Skill 管理ダッシュボード本番イメージ + Skill 用のボリュームマウントサーバーに Go/Node 不要、コンテナ1つで完結
Kubernetes デプロイ本番イメージ(ヘルスチェック + グレースフルシャットダウン + non-root)readiness/liveness プローブに対応、PodSecurityPolicy を通過
自動 Skill PR レビューCI イメージ + GitHub Actions での skillshare audit安全でない Skill のマージをブロック — ワークフローに1行追加するだけ
コンテナセキュリティコンプライアンスread_only + cap_drop: ALL + no-new-privilegesCIS Docker Benchmark、Trivy、Aqua スキャンを通過
コスト削減のための ARM サーバー(AWS Graviton)make docker-build-multiarchエミュレーションのオーバーヘッドなしのネイティブ arm64 イメージ

クイック例

永続的な Skill を持つセルフホストダッシュボード:

docker run -d \
-p 19420:19420 \
-v skillshare-data:/home/skillshare/.config/skillshare \
ghcr.io/runkids/skillshare

GitHub Actions での CI Skill 監査:

- name: Audit skills
run: |
docker run --rm \
-v ${{ github.workspace }}/skills:/skills \
ghcr.io/runkids/skillshare-ci audit /skills

Kubernetes デプロイ(最小構成):

apiVersion: apps/v1
kind: Deployment
metadata:
name: skillshare
spec:
replicas: 1
template:
spec:
containers:
- name: skillshare
image: ghcr.io/runkids/skillshare:latest
ports:
- containerPort: 19420
livenessProbe:
httpGet:
path: /api/health
port: 19420
readinessProbe:
httpGet:
path: /api/health
port: 19420
securityContext:
runAsNonRoot: true
readOnlyRootFilesystem: true

Dev プロファイル

Vite HMR でフロントエンドを開発する方法は2通りあります。

ローカルに Go がインストールされている場合(コマンド1つ):

make ui-dev              # Go API サーバー + Vite dev サーバーを同時に起動
# http://localhost:5173 を開く

Go がない場合(Go API は Docker 内で実行、Go の変更で自動リビルド):

# ターミナル 1
make dev-docker # Docker 内の Go API + Compose Watch (localhost:19420)

# ターミナル 2
cd ui && pnpm run dev # Vite dev サーバー (localhost:5173, /api を :19420 にプロキシ)

# 終了時
make dev-docker-down

どちらの方法でも ui/ の変更に対して即座に HMR が効きます。Docker バリアントは Go ツールチェーンを固定するため、コントリビューター間でバックエンドの挙動が一貫します。Go ファイルを編集すると、Compose Watch が変更を検知してコンテナをリビルドし、API サーバーを自動的に再起動します。Docker Compose v2.22 以上が必要です。

注意: make ui-dev を使う場合、Go コードの変更にはサーバーの再起動が必要です(Ctrl+C して再実行)。make dev-docker は Compose Watch により自動的にこれを処理します。


Devcontainer(VS Code / Codespaces / CLI)

すぐにコーディングできるコンテナでプロジェクトを開けます — ローカルに Go、Node、pnpm は不要です。VS Code の有無どちらでも動作します。

Devcontainer と Playground の違い

どちらも同じベースイメージとデモコンテンツを使用します。Playgroundmake playground)はコマンド探索のためのターミナルのみの環境です。Devcontainer は skillshare のコードベース自体を開発するための開発ツール(Go、Node、pnpm、air)を追加したもので、VS Code、Codespaces、または普通のターミナルから使用できます。

前提条件

  • Docker Desktop が起動していること
  • オプション A(ターミナル): 追加ツール不要 — make devc がすべて処理します
  • オプション B(VS Code): Dev Containers 拡張機能がインストールされた VS Code
GitHub Codespaces

GitHub 上で Code → Codespaces → New codespace をクリックします。Devcontainer の設定は自動的に読み込まれます — ローカルの Docker や拡張機能は不要です。

はじめ方

ターミナルから(VS Code 不要):

make devc            # イメージのビルド → コンテナ起動 → セットアップ → シェルに入る

初回実行はイメージのビルドや依存関係のインストールで数分かかります。以降の実行では既存のセットアップを検出し、すぐにシェルに移ります。

その他のライフサイクルコマンド:

make devc-up         # 起動のみ(シェルには入らない)
make devc-down # コンテナを停止
make devc-restart # 再起動 + start-dev.sh を再実行
make devc-reset # 完全リセット(ボリュームを削除)、その後 make devc で再初期化
make devc-status # コンテナのステータスを表示

VS Code から:

  1. VS Code でプロジェクトフォルダを開く
  2. Ctrl+Shift+P(macOS では Cmd+Shift+P)を押して Dev Containers: Reopen in Container を選択
  3. コンテナのビルドを待つ(初回は数分、以降は高速)
  4. 準備ができたら、セットアップスクリプトが自動的にバイナリをビルドし、デモ Skill を作成する

含まれるもの

Devcontainer はサンドボックスと同じ docker/sandbox/Dockerfile を再利用しているため、以下が含まれます。

  • Go 1.25 ツールチェーン
  • Node.js 24 + pnpm(Docker イメージに同梱)— コンテナ内で make ui-devcd website && pnpm start が使える
  • VS Code 拡張機能: Go、Tailwind CSS、ESLint、Prettier
  • 転送されるポート: 45173(Vite HMR)、49420(Go API)、48888(Docusaurus)— 意図的に一般的でない番号にしており、ホスト上の他のプロジェクトと衝突しません
  • /workspace にマウントされたソースコード
  • 事前設定済みのデモ環境 — インタラクティブプレイグラウンドと同じ:
    • PATH に登録されたショートカットコマンド(ssuidocs
    • 事前インストール済みのフロントエンド依存関係(ui/website/
    • グローバルデモ Skill(監査サンプル、デプロイチェックリスト)
    • カスタム監査ルール(Global + Project)
    • Project mode の Skill を含むデモプロジェクト ~/demo-project

コンテナ起動後のクイックスタート

ss status                 # Global mode — 初期化済み
ss list # デモ Skill を確認(フラット + ネスト)
ss audit # カスタムルールで監査を実行

cd ~/demo-project
ss status # Project mode を自動検出
ss audit # プロジェクトレベルの監査
ui -p # API を Project mode に切り替え → http://localhost:45173

フロントエンド開発

ポートサービスコマンド
45173Vite(React UI + HMR)ui または ui -p
49420Go API バックエンドui / ui -p から起動
48888Docusaurusdocs
ui                        # Global mode: API + Vite → http://localhost:45173
ui -p # Project mode: API + Vite → http://localhost:45173
ui stop # API + Vite を停止
docs # ドキュメントサイト → http://localhost:48888
docs stop # Docusaurus を停止

ui は Go API バックエンド(ポート 49420、バックグラウンド)と Vite dev サーバー(ポート 45173、HMR)の両方を起動します。uiui -p を切り替えると、新しいモードで API が自動的に再起動されます。VS Code はポートをホストのブラウザに自動転送します。

トークン設定

プライベートリポジトリアクセス用のトークン(GITHUB_TOKENGITLAB_TOKEN など)は複数のソースから取得できます。以下の順序でチェックされます。

優先度ソースセットアップ
1.devcontainer/.env.env.example.env にコピーし、値を入力(gitignore 対象)
2ホストの環境変数~/.zshrc に設定 — devcontainer.jsonremoteEnv 経由で転送
3gh auth loginコンテナ起動時に GITHUB_TOKEN を自動検出(GitHub のみ)

すべてのソースは任意です。コンテナ内でいつでも手動で export することもできます。

現在の状態を確認:

credential-helper status

プライベートリポジトリのテスト

VS Code の Dev Containers はホストの git 認証情報を自動的にコンテナに転送します。つまり、明示的なトークン環境変数がなくてもプライベートリポジトリの git clone が成功する場合があります — 転送された credential helper が暗黙的に認証を処理します。

テストのためにすべての認証(credential helper + トークン環境変数)を無効化するには:

eval "$(credential-helper --eval off)"    # すべて無効化
eval "$(credential-helper --eval on)" # すべて復元
credential-helper status # 現在の状態を確認

--eval を指定しない場合、git credential helper のみが切り替わります(トークン環境変数は有効のまま)。

テストの実行

make test          # unit + integration
make test-unit # unit のみ
make lint # go vet

本番イメージと CI イメージ

イメージの比較

3つの Dockerfile がそれぞれ異なる目的を持ちます。

本番CISandbox
イメージghcr.io/runkids/skillshareghcr.io/runkids/skillshare-ciローカルビルドのみ
Dockerfiledocker/production/Dockerfiledocker/ci/Dockerfiledocker/sandbox/Dockerfile
ベースdebian:bookworm-slimdebian:bookworm-slimgolang:1.25.5-bookworm
含まれるものgit、curl、tinigit のみGo ツールチェーン、gh、jq、air、delve、ビルド済み UI
Non-rootあり (UID 10001)なしなし
PID 1tinidefaultdefault
ヘルスチェックあり (/api/health)なしなし
エントリーポイントskillshare ui(Web ダッシュボード)skillshare(直接 CLI)entrypoint.sh(テストランナー)
用途セルフホストダッシュボード、KubernetesCI/CD での Skill 検証開発、テスト、プレイグラウンド
GHCR への公開ありありなし
マルチアーキamd64 + arm64amd64 + arm64ホストのアーキテクチャのみ

どれを使うべきか:

  • 本番 — サーバーや Kubernetes クラスタに Web UI ダッシュボードをデプロイする
  • CI — GitHub Actions / GitLab CI で auditinstall --dry-run、その他の検証コマンドを実行する
  • Sandbox — ローカル開発(make test-dockermake playgroundmake dev-docker

本番イメージ

組み込みの Web UI を含む軽量な本番イメージをビルドします。

make docker-build                          # 現在のプラットフォームのみ(高速、ローカルテスト向け)
make docker-build-multiarch # linux/amd64 + linux/arm64(低速、レジストリへのプッシュ向け)

docker-build は自分のマシンのアーキテクチャ向けのイメージのみを生成します — Apple Silicon で作った arm64 イメージは x86 サーバーでは動きません。レジストリにプッシュする場合は docker-build-multiarch を使い、どのプラットフォームでも適切なイメージが自動的に選ばれるようにします。

本番イメージは PID 1 として tini を使用し、non-root ユーザー(UID 10001)で実行され、ヘルスチェックを含み、初回起動時に設定を自動初期化します。デフォルトコマンド: skillshare ui -g --host 0.0.0.0 --no-open

公開されたイメージは GHCR で利用可能です(タグプッシュ時に自動的にプッシュされます)。

# pull して実行(amd64 または arm64 を自動選択)
docker run -d -p 19420:19420 ghcr.io/runkids/skillshare

# 永続的な Skill データ付き
docker run -d -p 19420:19420 \
-v skillshare-data:/home/skillshare/.config/skillshare \
ghcr.io/runkids/skillshare

CI イメージ

CI パイプラインで Skill を検証するための最小イメージです。

docker build -f docker/ci/Dockerfile -t skillshare-ci .
docker run --rm -v ./my-skills:/skills skillshare-ci audit /skills

CI イメージのエントリーポイントは skillshare 自体なので、サブコマンドを直接渡します。

# しきい値付きの監査
docker run --rm -v ./skills:/skills ghcr.io/runkids/skillshare-ci audit /skills --threshold HIGH

# リポジトリ検証のためのドライラン install
docker run --rm ghcr.io/runkids/skillshare-ci install org/repo --dry-run

Sandbox イメージ

Sandbox イメージはローカル開発・テスト専用です(GHCR には公開されません)。フルの Go ツールチェーン、開発ツール(air、delve)、GitHub CLI、ビルド済みフロントエンドアセットを含みます。

使用元: make test-dockermake test-docker-onlinemake playgroundmake dev-docker

使用方法は上記の PlaygroundDev プロファイル セクションを参照してください。

イメージタグとバージョニング

タグプッシュ時(v*)、docker-publish GitHub Actions ワークフローが本番イメージと CI イメージの両方をビルドし、マルチアーキ対応で GHCR にプッシュします。

各イメージには3つのパターンでタグが付けられます。

タグパターン説明
v<major>.<minor>.<patch>v0.16.1正確なバージョン(不変)
<major>.<minor>0.16このマイナーバージョンの最新パッチ(ローリング)
sha-<short>sha-153464aGit コミット SHA(不変)
ヒント

再現性のために本番環境では正確なバージョンタグ(v0.16.1)を使用してください。パッチ更新を自動的に取得するにはマイナータグ(0.16)を使用します。特定のコミットに固定するには sha- タグを使用します。

公開されたバージョンは GitHub Packages で確認できます。


制限事項と期待される挙動

  • Playground と Dev プロファイルはポート 19420 を共有します — 同時に1つだけ実行してください。もう一方を先に停止します(make playground-down または make dev-docker-down)。
  • オフラインサンドボックスはネットワークに依存する機能(例: GitHub からのリモート install)を検証できません。
  • Playground はコンテナローカルの HOME を使用するため、実際のホストのホーム設定を直接変更することはありません。
  • Go コードの変更は自動的に反映されます(マウントされたソースからコンテナ内で go build が実行されます)。フロントエンド(ui/)の変更は、Devcontainer 内で make ui-dev(Vite HMR)を実行しているときに即座に反映されます。Devcontainer と Playground の両方に Node.js と pnpm が含まれています。
  • カスタムの実験が必要な場合は、コマンドを直接渡してください。
./scripts/test_docker.sh --cmd "go test -v ./tests/integration/..."
./scripts/sandbox_playground_shell.sh "skillshare list"

関連項目