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

# Konzepte

## Funktionsweise

Auf hoher Ebene funktioniert ein Template-Build wie folgt:

1. Die Template-Quelle auflösen, z. B. ein Standard-Basis-Image, ein vorhandenes Image, ein Dockerfile oder ein anderes Template.
2. Template-Anweisungen anwenden, z. B. `runCmd`, `copy`, `makeDir`, `setEnvs` und Hilfsfunktionen zur Paketinstallation.
3. Falls konfiguriert, den Startbefehl des Templates starten.
4. Warten, bis der [Ready-Befehl](/docs/de/guides/sandbox-template-authoring#start--ready-commands) erfolgreich ist.
5. Die vorbereitete Umgebung als wiederverwendbares Template speichern.

Der Build erzeugt eine `templateId` / `template_id` und eine `buildId` / `build_id`. Verwende die Template-ID später mit `Sandbox.create(...)`.

## Benutzer und Arbeitsverzeichnis

Templates können den standardmäßigen Linux-Benutzer und das Arbeitsverzeichnis festlegen, die von späteren Build-Schritten und von der finalen Umgebung verwendet werden.

Verwende `setUser(...)` / `set_user(...)`, wenn Build-Befehle als bestimmter Benutzer ausgeführt werden müssen. Verwende `setWorkdir(...)` / `set_workdir(...)`, wenn spätere Befehle und kopierte Dateien relativ zu einem bestimmten Verzeichnis aufgelöst werden sollen.

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

  const template = Template()
    .fromUbuntuImage("24.04")
    .setUser("root")
    .setWorkdir("/app")
    .runCmd("apt-get update && apt-get install -y curl")
    .copy("package.json", "/app/package.json")
  ```

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

  template = (
      Template()
      .from_ubuntu_image("24.04")
      .set_user("root")
      .set_workdir("/app")
      .run_cmd("apt-get update && apt-get install -y curl")
      .copy("package.json", "/app/package.json")
  )
  ```
</CodeGroup>

Wenn du diese Werte nicht festlegst, verwendet die Sandbox die Standardwerte des ausgewählten Basis-Images.

## Caching

Template-Builds cachen zuvor abgeschlossene Layer, sodass wiederholte Builds nicht jede Anweisung erneut ausführen müssen.

Das ist normalerweise das gewünschte Verhalten für schnelle Iterationen. Wenn du einen vollständig frischen Build benötigst, deaktiviere den Cache für den gesamten Build mit `skipCache: true` / `skip_cache=True`, oder markiere die Template-Kette mit `skipCache()` / `skip_cache()`.

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

  const template = Template()
    .fromPythonImage("3.12")
    .skipCache()
    .runCmd("pip install -U pip")

  const build = await Template.build(template, "my-template-no-cache", {
    skipCache: true,
  })
  ```

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

  template = (
      Template()
      .from_python_image("3.12")
      .skip_cache()
      .run_cmd("pip install -U pip")
  )

  build = Template.build(
      template,
      "my-template-no-cache",
      skip_cache=True,
  )
  ```
</CodeGroup>

Setze Cache-Busting bewusst ein. Es verlangsamt Builds und sollte normalerweise für das Aktualisieren von Abhängigkeiten, Debugging oder Änderungen an Eingaben reserviert werden, die nicht allein aus der Template-Definition ersichtlich sind.
