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

# Concepts

## Fonctionnement

À un niveau général, la création d’un template fonctionne comme suit :

1. Résoudre la source du template, comme une image de base standard, une image existante, un Dockerfile ou un autre template.
2. Appliquer les instructions du template, comme `runCmd`, `copy`, `makeDir`, `setEnvs`, et les assistants d’installation de packages.
3. Si cela est configuré, démarrer la commande de démarrage du template.
4. Attendre que la [commande ready](/docs/fr/guides/sandbox-template-authoring#start--ready-commands) réussisse.
5. Enregistrer l’environnement préparé comme template réutilisable.

La création produit un `templateId` / `template_id` et un `buildId` / `build_id`. Utilisez ensuite l’ID du template avec `Sandbox.create(...)`.

## Utilisateur et répertoire de travail

Les templates peuvent définir l’utilisateur Linux par défaut et le répertoire de travail utilisés par les étapes de build ultérieures et par l’environnement final.

Utilisez `setUser(...)` / `set_user(...)` lorsque les commandes de build doivent s’exécuter en tant qu’utilisateur spécifique. Utilisez `setWorkdir(...)` / `set_workdir(...)` lorsque les commandes ultérieures et les fichiers copiés doivent être résolus relativement à un répertoire spécifique.

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

Si vous ne définissez pas ces valeurs, le sandbox utilise les valeurs par défaut de l’image de base sélectionnée.

## Mise en cache

Les builds de templates mettent en cache les couches précédemment terminées afin que les builds répétés n’aient pas à réexécuter chaque instruction.

C’est généralement ce que vous souhaitez pour itérer rapidement. Lorsque vous avez besoin d’un build entièrement frais, désactivez le cache pour tout le build avec `skipCache: true` / `skip_cache=True`, ou marquez la chaîne de templates avec `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>

Utilisez l’invalidation du cache intentionnellement. Elle ralentit les builds et devrait normalement être réservée aux actualisations de dépendances, au débogage ou aux modifications d’entrées qui ne sont pas visibles depuis la seule définition du template.
