以前の記事
で紹介した one-off-docker-runner に、volumes の「host bind」機能が追加・改善されました。本記事では、Run API の正確な JSON リクエスト形式、各パラメータの意味、注意点をまとめます。この記事だけでコピペ再現できます。
- リポジトリ: https://github.com/tumf/oneoff-docker-runner
- README: https://github.com/tumf/oneoff-docker-runner/blob/main/README.md
- 対象機能: Run API の
volumes指定(type = "host")
できること(概要)
ホスト上の既存ファイルやディレクトリを、コンテナ内の任意のパスに bind mount できます。これにより、
- 実行前にホスト側で用意した入力(設定、データ)をコンテナへ渡す
- 実行後にコンテナ側で生成された成果物をホスト側でそのまま参照する といったワークフローがシンプルに実現できます。
volumes キーの基本
- キー(左側)は「コンテナ側のマウントパス」とオプションのアクセス修飾子で構成します。
- 形式:
<container_path>[:ro|:rw] - 例:
/app/data,/etc/config:ro - 省略時は
rw(読み書き)
- 形式:
- 値(右側)は
VolumeConfigオブジェクトで、typeにより意味が変わります。file|directory|volume|host
- 今回の主題である
type = "host"では、以下がポイントです(README 準拠)。- 必須:
host_path(ホスト上の絶対パス) - 禁止:
response(true指定はサポート外で拒否されます)
- 必須:
README の該当要点:
- bind source は
type=hostの場合、host_pathに与えた「ホスト上の絶対パス」 type=hostではresponseはサポートされず、指定するとエラーとして拒否されます
最小リクエスト例(host のファイル + ディレクトリ)
以下はホスト上の host.txt とディレクトリをコンテナにマウントし、中身を確認する最小例です。
unchanged above
最小リクエスト例(host のファイル + ディレクトリ)
以下はホスト上の host.txt とディレクトリをコンテナにマウントし、中身を確認する最小例です。
{
"image": "alpine:latest",
"command": ["sh", "-c", "ls -la /app && cat /app/host.txt || true"],
"volumes": {
"/app/host.txt:ro": { "type": "host", "host_path": "/absolute/path/to/host.txt" },
"/app/data": { "type": "host", "host_path": "/absolute/path/to/dir" }
}
}
curl での呼び出し例
ローカルでサーバーを起動している前提(例: docker run --rm -p 8000:8000 -v /var/run/docker.sock:/var/run/docker.sock ghcr.io/tumf/oneoff-docker-runner)。
curl -sS -X POST 'http://localhost:8000/run' \
-H 'accept: application/json' \
-H 'Content-Type: application/json' \
-d '{
"image": "alpine:latest",
"command": ["sh", "-c", "ls -la /app && cat /app/host.txt || true"],
"volumes": {
"/app/host.txt:ro": { "type": "host", "host_path": "/absolute/path/to/host.txt" },
"/app/data": { "type": "host", "host_path": "/absolute/path/to/dir" }
}
}'
API 仕様の要点(README 準拠)
- volumes のキー(左側)は「コンテナ側のマウントパス[:ro|:rw]」
- 例:
/app/data,/etc/config:ro(省略時はrw)
- 例:
- 値(右側)は VolumeConfig。
typeにより意味が変わるfile|directory|volume|host
type = "host"のとき- 必須:
host_path(ホスト上の絶対パス) - 禁止:
response(true指定はサポート外で拒否されます)
- 必須:
type = "file" | "directory"のときcontentに base64(ファイルはそのまま、ディレクトリは tar.gz の base64)response: trueを付けると実行後に内容がレスポンスへ返却されます
注意点(環境依存の罠)
- 絶対パス必須:
host_pathは絶対パスのみサポート - 実体の存在: 指定したファイル/ディレクトリがホストに存在していること
- 権限: OneOffDockerRunner が参照できる権限が必要(パーミッション/所有者)
- SELinux/AppArmor: 制約により読み書きできない場合があります(必要に応じてコンテナ設定を見直す)
- Docker Desktop: macOS/Windows は「File Sharing(共有ディレクトリ)」設定が必要な場合があります
- Windows パス: WSL/VM 環境ではホストの実際のパス解決に注意(WSL パスと Windows パスの違い)
- ルートレス Docker: 一部のホストパスがマウント不可な構成があり得ます
よくあるエラーと対処
- 422 Unprocessable Entity(バリデーションエラー)
host_pathが相対パス/未指定、responseを誤って指定、など
- 500 Internal Server Error(実行時エラー)
- マウント先が存在しない/権限不足/ホスト側のパス未存在 など。コンテナ出力(stdout/stderr)や API の
detailを確認
- マウント先が存在しない/権限不足/ホスト側のパス未存在 など。コンテナ出力(stdout/stderr)や API の