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

# Criação

## Imagem base

Todo template começa a partir de um ambiente de origem. O SDK oferece suporte a vários pontos de entrada, dependendo de quanto controle você precisa.

* `fromPythonImage(...)` / `from_python_image(...)` para um runtime Python padrão
* `fromUbuntuImage(...)` / `from_ubuntu_image(...)` ou `fromDebianImage(...)` / `from_debian_image(...)` para uma base Linux padrão
* `fromNodeImage(...)` / `from_node_image(...)` e `fromBunImage(...)` / `from_bun_image(...)` para bases específicas de linguagem
* `fromImage(...)` / `from_image(...)` para uma imagem de contêiner arbitrária
* `fromDockerfile(...)` / `from_dockerfile(...)` quando seu Dockerfile já é a fonte da verdade
* `fromBaseImage()` / `from_base_image()` para começar a partir da base padrão da plataforma
* `fromTemplate(...)` / `from_template(...)` para criar uma camada sobre outro template

`fromPythonImage("3.12")` e `from_python_image("3.12")` são equivalentes a começar a partir de:

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

## Registries privados

Se sua imagem base estiver em um registry privado, passe as credenciais ao definir a origem do template.

Os SDKs JS e Python oferecem suporte a:

* credenciais genéricas de registry com nome de usuário e senha
* credenciais de registry da AWS
* credenciais de registry do GCP
* credenciais de registry do Huawei Cloud

Exemplo de registry privado genérico:

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

## Definindo o template

A API do builder permite compor o ambiente final diretamente no código. Etapas comuns de definição incluem:

* `runCmd(...)` / `run_cmd(...)` para instalar pacotes ou executar comandos de provisionamento
* `copy(...)` para incluir arquivos locais
* `makeDir(...)`, `remove(...)`, `rename(...)` e `makeSymlink(...)` para modelagem do sistema de arquivos
* `setEnvs(...)` / `set_envs(...)` para variáveis de ambiente
* `pipInstall(...)`, `npmInstall(...)`, `bunInstall(...)` e `aptInstall(...)` para configuração de pacotes
* `gitClone(...)` / `git_clone(...)` para trazer código para a imagem

Exemplo:

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

## Comandos de inicialização e prontidão

Use um comando de inicialização quando o template deve iniciar um serviço de longa execução durante o resultado da build, e use um comando de prontidão para definir quando esse serviço é considerado saudável.

Isso é útil para apps web, servidores de API, workers em segundo plano e qualquer template que já deve estar inicializado quando um sandbox começa.

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

Você também pode configurar a prontidão separadamente com `setReadyCmd(...)` / `set_ready_cmd(...)`.
