> ## 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.

# Aanmaken

## Basisimage

Elke template begint vanuit een bronomgeving. De SDK ondersteunt verschillende ingangspunten, afhankelijk van hoeveel controle je nodig hebt.

* `fromPythonImage(...)` / `from_python_image(...)` voor een standaard Python-runtime
* `fromUbuntuImage(...)` / `from_ubuntu_image(...)` of `fromDebianImage(...)` / `from_debian_image(...)` voor een standaard Linux-basis
* `fromNodeImage(...)` / `from_node_image(...)` en `fromBunImage(...)` / `from_bun_image(...)` voor taalspecifieke bases
* `fromImage(...)` / `from_image(...)` voor een willekeurig containerimage
* `fromDockerfile(...)` / `from_dockerfile(...)` wanneer je Dockerfile al de bron van waarheid is
* `fromBaseImage()` / `from_base_image()` om te starten vanuit de standaardbasis van het platform
* `fromTemplate(...)` / `from_template(...)` om boven op een andere template te bouwen

`fromPythonImage("3.12")` en `from_python_image("3.12")` zijn gelijkwaardig aan starten vanuit:

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

## Privéregisters

Als je basisimage zich in een privéregister bevindt, geef dan inloggegevens door bij het definiëren van de templatebron.

De JS- en Python-SDK's ondersteunen:

* generieke registerinloggegevens met gebruikersnaam en wachtwoord
* AWS-registerinloggegevens
* GCP-registerinloggegevens
* Huawei Cloud-registerinloggegevens

Voorbeeld van een generiek privéregister:

<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>

## Template definiëren

Met de builder-API kun je de uiteindelijke omgeving rechtstreeks in code samenstellen. Veelvoorkomende definitiestappen zijn onder andere:

* `runCmd(...)` / `run_cmd(...)` om pakketten te installeren of provisioning-opdrachten uit te voeren
* `copy(...)` om lokale bestanden op te nemen
* `makeDir(...)`, `remove(...)`, `rename(...)`, en `makeSymlink(...)` voor het vormgeven van het bestandssysteem
* `setEnvs(...)` / `set_envs(...)` voor omgevingsvariabelen
* `pipInstall(...)`, `npmInstall(...)`, `bunInstall(...)`, en `aptInstall(...)` voor pakketconfiguratie
* `gitClone(...)` / `git_clone(...)` om code in het image op te nemen

Voorbeeld:

<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>

## Start- en ready-opdrachten

Gebruik een startopdracht wanneer de template tijdens het buildresultaat een langlopende service moet opstarten, en gebruik een ready-opdracht om te definiëren wanneer die service als gezond wordt beschouwd.

Dit is handig voor webapps, API-servers, achtergrondwerkers en elke template die al geïnitialiseerd moet zijn wanneer een sandbox start.

<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>

Je kunt readiness ook afzonderlijk configureren met `setReadyCmd(...)` / `set_ready_cmd(...)`.
