> ## Documentation Index
> Fetch the complete documentation index at: https://docs.coreweave.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Compose ファイルからサンドボックスを作成する

> Docker Compose ファイルをサンドボックス API にアップロードして、複数のコンテナーで構成されるサンドボックスを起動します。

`POST /v1/sandboxes:createFromFile` は、アップロードされたファイルからサンドボックスを起動します。ファイルタイプとファイルのバイト列を送信すると、サンドボックスのゲートウェイがドキュメントをサンドボックスの spec に変換し、`POST /v1/sandboxes` と同じ作成処理を実行します。

受け付けるファイルタイプは Docker Compose (`SANDBOX_FILE_TYPE_COMPOSE`) のみです。ファイル内の各サービスは、単一のサンドボックス内のコンテナーになり、指定した 1 つのサービスがサンドボックスのプライマリになります。ゲートウェイはファイルのバイト列を保存しません。`GET /v1/sandboxes/{sandboxId}` は変換された spec を返します。

これは Docker Compose と同等の機能を提供するものではありません。既存の project をインポートする前に、[Compose のサポート](#compose-support)をお読みください。

<h2 id="before-you-begin">
  始める前に
</h2>

以下の例では Forge APIキーを使用します。詳しくは[はじめに](/ja/products/sandboxes/get-started)を参照してください。キーは `x-wandb-api-key` ヘッダーで送信します。デフォルト以外の Forge entity にサンドボックスを作成する場合は、`x-entity-id` も送信してください。

```bash theme={"system"}
export FORGE_API_KEY="[FORGE-API-KEY]"
```

`SANDBOX_USER` action を持つ CoreWeave API アクセストークンを使用することもできます。これは CKS への配置にも使用できます。[認証情報を選択して取得する](/ja/products/sandboxes/placement#choose-and-get-credentials)の手順に従ったうえで、トークンを設定します。

```bash theme={"system"}
export CWSANDBOX_API_KEY="[API-ACCESS-TOKEN]"
```

そのトークンを使用するには、このガイドのすべてのリクエストで `-H "x-wandb-api-key: $FORGE_API_KEY"` を `-H "Authorization: Bearer $CWSANDBOX_API_KEY"` に置き換えてください。認証方式とエラーの形式は、API のほかの部分と同じです。詳しくは、[API の概要](/ja/products/sandboxes/reference/control-plane-api)を参照してください。

<h2 id="request-fields">
  リクエストフィールド
</h2>

| フィールド | 必須 | 説明 |
| - | - | - |
| `type` | はい | ドキュメントの種類です。`SANDBOX_FILE_TYPE_COMPOSE` を使用します。 |
| `contents` | はい | JSON 内で base64 エンコードされたファイルのバイト列です。UTF-8、最大 256 KiB です。 |
| `primaryService` | はい | サンドボックスのプライマリとなるサービスです。`contents` 内のサービス名を指定する必要があります。デフォルトはありません。 |
| `imageOverrides` | いいえ | サービスごとのイメージ参照です。キーにはファイル内のサービス名を指定する必要があります。本来ビルドが必要なサービスに、プル可能なイメージを指定するために使用します。 |
| `defaultResources` | 条件付き | `deploy.resources` を省略した各サービスにコピーされる CPU とメモリです。コンテナーごとの設定であり、project の予算ではありません。ここで GPU を指定すると拒否されます。ファイルに複数のサービスがあり、いずれかのサービスで `deploy.resources` が省略されている場合は必須です。 |

リクエストでは、`mode`、`maxLifetimeSeconds`、`tags`、`network`、`objectStorageAccess`、`annotations`、`runnerIds`、`requestId` も受け入れます。意味は `POST /v1/sandboxes` と同じです。`networkIds` は `UNIMPLEMENTED` を返します。

CKS への配置では、CoreWeave API アクセストークンを使用し、[サンドボックスの配置とスピルオーバー](/ja/products/sandboxes/placement) の説明に従って配置フィールドを設定してください。オブジェクトストレージの前提条件については、[サンドボックスに AI Object Storage へのアクセスを許可する](/ja/products/sandboxes/operations/object-storage-access) を参照してください。

指定できるフィールドはこの一覧に限られます。このエンドポイントでは、ボリューム、インスタンスタイプ、ランタイムクラス、イメージをプルするための認証情報、公開サービスは利用できません。これらが必要な場合は、`POST /v1/sandboxes` を使用してください。

<h2 id="create-the-sandbox">
  サンドボックスを作成する
</h2>

Compose ファイルを作成します。

```bash title="Write compose.yaml" theme={"system"}
cat > compose.yaml <<'EOF'
services:
  helper:
    image: docker.io/library/busybox:1.36
    command: ["sleep", "3600"]
    expose: ["8080"]
    healthcheck:
      test: ["CMD", "true"]
      interval: 1s
      timeout: 1s
      retries: 3
  main:
    image: docker.io/library/busybox:1.36
    command: ["sleep", "3600"]
    environment:
      HELPER_HOST: helper
    depends_on:
      helper:
        condition: service_healthy
EOF
```

`contents` を base64 エンコードして POST します。

```bash title="Create a sandbox from compose.yaml" theme={"system"}
jq -n --rawfile yaml compose.yaml '{
  type: "SANDBOX_FILE_TYPE_COMPOSE",
  contents: ($yaml | @base64),
  primaryService: "main",
  defaultResources: { requests: { cpu: "100m", memory: "128Mi" } },
  maxLifetimeSeconds: 3600,
  tags: ["from-file"]
}' | curl -sS -X POST https://api.cwsandbox.com/v1/sandboxes:createFromFile \
  -H "x-wandb-api-key: $FORGE_API_KEY" \
  -H "Content-Type: application/json" \
  -d @-
```

応答は `STATE_CREATING` 状態のサンドボックスです。`STATE_RUNNING` または終端状態になるまで、その `sandboxId` をポーリングします。

```bash title="Poll the sandbox" theme={"system"}
export SANDBOX_ID="[SANDBOX-ID]"

curl -sS "https://api.cwsandbox.com/v1/sandboxes/$SANDBOX_ID" \
  -H "x-wandb-api-key: $FORGE_API_KEY"
```

返された spec には 2 つのコンテナーがあり、`main` はプライマリとして指定され、`HELPER_HOST` は引き続き `helper` に設定されています。サンドボックス内では、`helper` は `127.0.0.1` に解決されます。

作成を安全に再試行するには、`requestId` を送信します。同じ `requestId` と同じ宣言済みの入力を使用すると、既存のサンドボックスが返されます。同じ `requestId` でもバイト列が異なる場合は、空白のみの変更も含め、理由 `CWSANDBOX_REQUEST_ID_CONFLICT` とともに `ALREADY_EXISTS` が返されます。

<h2 id="compose-support">
  Compose のサポート
</h2>

すべてのサービスは、1 つの Pod と 1 つのネットワーク namespace を共有します。サービス名は `127.0.0.1` に解決されるため、`HELPER_HOST: helper` や `API_BASE: http://main:8080` などの値は、ファイルを書き換えずに使用できます。サンドボックスには、サービスごとの IP アドレス、ブリッジネットワーク、レプリカはありません。

以下の動作は Docker Compose と異なります。

* **起動は逐次実行されます。** プライマリ以外の各サービスは、プライマリより先に、順番に起動します。これを考慮して `maxLifetimeSeconds` を設定してください。サービスが準備完了にならない場合、サンドボックスは `STATE_CREATING` のままになります。
* **`RUNNING` はプライマリのみをトラッキングします。** 起動後にヘルパーがクラッシュしても、サンドボックスは失敗しません。
* **`healthcheck` は exec のみの起動プローブになります。** `test` は string、`CMD`、`CMD-SHELL`、または `NONE` である必要があり、期間は整数秒で指定する必要があります。プローブの再試行回数を使い切ると、コンテナーは異常とマークされるのではなく、停止されます。
* **ポートは Pod 内にとどまります。** `expose` と `ports` は待ち受けポートを宣言しますが、外部には公開されません。
* **イメージはプル可能である必要があります。** すべてのサービスで、ファイル内の `image:` または `imageOverrides` 内のエントリが必要です。依然として `build:` が必要なサービスは、`UNIMPLEMENTED` を返します。
* **`command` と `entrypoint` は Docker のシェル形式と exec 形式に従います。** イメージのデフォルトを使用するには、これらを省略してください。明示的な `null` と `[]` は拒否されます。
* **GPU はプライマリ専用です**。`deploy.resources.reservations.devices` で `gpu` 機能と正の整数の個数を指定します。
* **名前は DNS-1123 ラベルである必要があります** (`My_App` ではなく `my-app`) 。また、予約済みの接頭辞 `cw-object-store-agent`、`cw-object-store-agent-restore`、`dns-egress` は使用できません。

<h3 id="unsupported-keys">
  サポートされないキー
</h3>

ドキュメントは自己完結している必要があります。ゲートウェイはディスクを読み取らず、環境変数も展開しません。認識されないキーは無視されず、問題のあるフィールドのパスとともに拒否されます。

| 拒否される項目 | メモ |
| - | - |
| `$VAR` および `${VAR}` の補間 | リテラルの `$` には `$$` を記述してください。 |
| `include`, `extends`, `env_file` | インラインの `environment` または `env` のみ使用してください。値のないキーと `null` 値も拒否されます。 |
| `volumes`, `tmpfs`, `configs`, `secrets`, バインドマウント | 名前付きボリュームを使用する project はインポートできません。 |
| `restart`, `logging`, `profiles`, `stdin_open`, `tty`, `scale` | このランタイムでは実装されていません。 |
| `network_mode`, `pid`, `ipc`, `extra_hosts`, 名前付きネットワーク | Pod は 1 つ、namespace は 1 つです。 |
| ホストからコンテナーへのポートマッピング、バインドアドレス、ポート範囲、TCP 以外のプロトコル、サービス間で重複するポート | エントリごとに TCP 待ち受けポートは 1 つで、サンドボックス内で一意である必要があります。 |
| `depends_on: service_completed_successfully`、またはプライマリを対象とする `depends_on` | プライマリ以外のサービス間では `service_healthy` と `service_started` がサポートされます。 |
| Compose のメモリ表記 (`512m`, `2g`, `512mb`) | `512Mi` や `1Gi` などの Kubernetes の数量表記を使用してください。 |
| 名前による `user` 値 (`nobody`) | 数値の UID を使用してください。 |

ゲートウェイは `version`、project の `name`、`labels`、`x-*` 拡張キーを無視します。`labels` がサンドボックスに渡されることを前提にしないでください。

<h2 id="common-errors">
  よくあるエラー
</h2>

フィールド違反は、パスと制限値を示す `BadRequest` の詳細として返されます。ドキュメントの内容は引用されません。

| 状況 | コードと理由 | フィールド |
| - | - | - |
| `type` が省略されている | `INVALID_ARGUMENT`、`CWSANDBOX_INVALID_REQUEST` | `type` |
| Compose 以外のタイプ | `UNIMPLEMENTED`、`CWSANDBOX_NOT_IMPLEMENTED` | `type` |
| `primaryService` が省略されている、または不明 | `INVALID_ARGUMENT`、`CWSANDBOX_INVALID_REQUEST` | `primary_service` |
| `image:` と `build:` のどちらも指定されていないサービス | `INVALID_ARGUMENT`、`CWSANDBOX_INVALID_REQUEST` | `contents.services.<name>` |
| `build:` が必要なままのサービス | `UNIMPLEMENTED`、`CWSANDBOX_NOT_IMPLEMENTED` | `contents.services.<name>.build` |
| ファイルが 256 KiB を超えている、または単一の UTF-8 YAML ドキュメントではない | `INVALID_ARGUMENT`、`CWSANDBOX_INVALID_REQUEST` | `contents` |
| サポートされていない Compose キー | `INVALID_ARGUMENT`、`CWSANDBOX_INVALID_REQUEST` | キーのパス |
| `requestId` が同じでバイト列が異なる | `ALREADY_EXISTS`、`CWSANDBOX_REQUEST_ID_CONFLICT` | なし |

<h2 id="see-also">
  関連情報
</h2>

* [はじめに](/ja/products/sandboxes/get-started): spec から最初のサンドボックスを作成します。
* [API の概要](/ja/products/sandboxes/reference/control-plane-api): 認証、バージョン管理、エラー処理について説明します。
* [サンドボックスの環境変数](/ja/products/sandboxes/environment-variables): プラットフォームが各コンテナーに注入する環境変数について説明します。
