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

# オーサリング

## ベースイメージ

すべてのテンプレートはソース環境から始まります。SDK は、必要な制御の度合いに応じて複数のエントリーポイントをサポートしています。

* 標準的な Python ランタイムには `fromPythonImage(...)` / `from_python_image(...)`
* 標準的な Linux ベースには `fromUbuntuImage(...)` / `from_ubuntu_image(...)` または `fromDebianImage(...)` / `from_debian_image(...)`
* 言語固有のベースには `fromNodeImage(...)` / `from_node_image(...)` および `fromBunImage(...)` / `from_bun_image(...)`
* 任意のコンテナイメージには `fromImage(...)` / `from_image(...)`
* Dockerfile がすでに信頼できる情報源である場合は `fromDockerfile(...)` / `from_dockerfile(...)`
* プラットフォームのデフォルトベースから開始するには `fromBaseImage()` / `from_base_image()`
* 別のテンプレートの上にレイヤーを重ねるには `fromTemplate(...)` / `from_template(...)`

`fromPythonImage("3.12")` と `from_python_image("3.12")` は、以下から開始するのと同等です。

```dockerfile Dockerfile icon="docker" theme={"system"}
FROM python:3.12
```

## プライベートレジストリ

ベースイメージがプライベートレジストリにある場合は、テンプレートソースを定義するときに認証情報を渡します。

JS と Python の SDK は以下をサポートしています。

* ユーザー名とパスワードによる汎用レジストリ認証情報
* AWS レジストリ認証情報
* GCP レジストリ認証情報
* Huawei Cloud レジストリ認証情報

汎用プライベートレジストリの例:

<CodeGroup>
  ```ts JavaScript & TypeScript icon="js" theme={"system"}
  import { Template } from "novita-sandbox"

  const template = Template().fromRegistry(
    "registry.example.com/team/myimage:latest",
    {
      username: process.env.REGISTRY_USERNAME,
      password: process.env.REGISTRY_PASSWORD,
    }
  )

  const build = await Template.build(template, "my-private-image-template")
  console.log(build.templateId)
  ```

  ```python Python icon="python" theme={"system"}
  import os

  from novita_sandbox.core import Template

  template = Template().from_registry(
      "registry.example.com/team/myimage:latest",
      username=os.environ.get("REGISTRY_USERNAME"),
      password=os.environ.get("REGISTRY_PASSWORD"),
  )

  build = Template.build(template, "my-private-image-template")
  print(build.template_id)
  ```
</CodeGroup>

## テンプレートの定義

ビルダー API を使用すると、最終的な環境をコード内で直接構成できます。一般的な定義手順には以下が含まれます。

* パッケージのインストールやプロビジョニングコマンドの実行には `runCmd(...)` / `run_cmd(...)`
* ローカルファイルを含めるには `copy(...)`
* ファイルシステムの構成には `makeDir(...)`、`remove(...)`、`rename(...)`、および `makeSymlink(...)`
* 環境変数には `setEnvs(...)` / `set_envs(...)`
* パッケージ設定には `pipInstall(...)`、`npmInstall(...)`、`bunInstall(...)`、および `aptInstall(...)`
* コードをイメージに取り込むには `gitClone(...)` / `git_clone(...)`

例:

<CodeGroup>
  ```ts JavaScript & TypeScript icon="js" theme={"system"}
  import { Template } from "novita-sandbox"

  const template = Template()
    .fromPythonImage("3.12")
    .setWorkdir("/app")
    .setEnvs({
      APP_ENV: "production",
      PORT: "8000",
    })
    .runCmd("pip install fastapi uvicorn")
    .copy("app.py", "/app/app.py")
  ```

  ```python Python icon="python" theme={"system"}
  from novita_sandbox.core import Template

  template = (
      Template()
      .from_python_image("3.12")
      .set_workdir("/app")
      .set_envs(
          {
              "APP_ENV": "production",
              "PORT": "8000",
          }
      )
      .run_cmd("pip install fastapi uvicorn")
      .copy("app.py", "/app/app.py")
  )
  ```
</CodeGroup>

## 開始コマンドと準備完了コマンド

テンプレートがビルド結果内で長時間実行されるサービスを起動する必要がある場合は、開始コマンドを使用します。また、そのサービスが正常と見なされる条件を定義するには、準備完了コマンドを使用します。

これは、Web アプリ、API サーバー、バックグラウンドワーカー、およびサンドボックスの開始時にすでに初期化済みであるべきあらゆるテンプレートに役立ちます。

<CodeGroup>
  ```ts JavaScript & TypeScript icon="js" theme={"system"}
  import { Template } from "novita-sandbox"

  const template = Template()
    .fromPythonImage("3.12")
    .runCmd("pip install fastapi uvicorn")
    .copy("app.py", "/home/user/app.py")
    .setStartCmd(
      "uvicorn app:app --host 0.0.0.0 --port 8000",
      "python - <<'PY'\nimport urllib.request\nurllib.request.urlopen('http://127.0.0.1:8000', timeout=2)\nPY"
    )
  ```

  ```python Python icon="python" theme={"system"}
  from novita_sandbox.core import Template

  template = (
      Template()
      .from_python_image("3.12")
      .run_cmd("pip install fastapi uvicorn")
      .copy("app.py", "/home/user/app.py")
      .set_start_cmd(
          "uvicorn app:app --host 0.0.0.0 --port 8000",
          "python - <<'PY'\nimport urllib.request\nurllib.request.urlopen('http://127.0.0.1:8000', timeout=2)\nPY",
      )
  )
  ```
</CodeGroup>

`setReadyCmd(...)` / `set_ready_cmd(...)` を使用して、準備完了状態を個別に設定することもできます。
