CLI exec

Executa una comanda amb els secrets al seu entorn, sense escriure cap fitxer .env.

Comanda exec

envilder exec resol tots els secrets del map file i inicia una comanda amb aquests valors al seu entorn. No s'escriu res a disc: no hi ha cap fitxer .env per afegir al .gitignore, mantenir sincronitzat o esborrar. El map file i el seu $config funcionen exactament igual que en el mode pull.

Ús

envilder exec [options] [--] <command> [args...]

On comença la teva comanda: la regla del --

Primer van les opcions d'Envilder. La teva comanda comença al primer argument que no és una opció d'Envilder, o just després del -- si n'hi ha. Tot el que ve a continuació arriba tal qual a la teva comanda, encara que sembli una opció d'Envilder. El -- és opcional: només el necessites quan la comanda mateixa comença amb -.

# Tot és de npm
envilder exec npm run dev

# --map és d'Envilder, la resta és de npm
envilder exec --map=cfg.json npm run dev

# --map=x és de npm: va després de la comanda
envilder exec npm run dev --map=x

# El mateix, amb un separador explícit
envilder exec --map=cfg.json -- npm run dev

Opcions

OpcióDescripció
--mapRuta al map file (per defecte: envilder.json)
--profilePerfil AWS CLI. Té prioritat sobre $config.profile
--provideraws o azure. Té prioritat sobre $config.provider
--vault-urlURL de l'Azure Key Vault. Té prioritat sobre $config.vaultUrl

Les opcions d'Envilder van després d'exec, mai abans. Una opció escrita abans d'exec es rebutja amb el codi de sortida 125, i Envilder et mostra la comanda corregida:

$ envilder --map=config/prod.json exec -- npm start
error: Put envilder options after "exec": envilder exec --map=config/prod.json -- npm …

El mode exec mai llegeix ni escriu cap fitxer .env i mai puja secrets, així que --envfile, --push, --key, --value i --secret-path es rebutgen amb el codi de sortida 125 abans de cap crida al proveïdor. Una opció desconeguda abans de la comanda també és un error: un error tipogràfic com --mapp mai arriba a la teva comanda per accident.

OpcióMissatge
--envfile--envfile cannot be used with exec: exec mode never reads or writes a .env file.
--push--push cannot be used with exec.
--key, --value, --secret-pathSingle-secret push options cannot be used with exec.

Exemples

# Arrenca el servidor de desenvolupament amb els secrets d'envilder.json
npx envilder exec -- npm run dev

# Fes servir un map file concret
envilder exec --map=config/envilder.json -- node server.js

# Azure Key Vault amb flags de la CLI
envilder exec --provider=azure   --vault-url=https://my-vault.vault.azure.net -- dotnet run

# Docker Compose pot interpolar els secrets al compose.yaml
envilder exec -- docker compose up

O integra-ho als scripts del package.json:

package.jsonjson
{
  "scripts": {
    "dev": "envilder exec -- vite",
    "start": "envilder exec --map=config/prod.json -- node server.js"
  }
}

Sortida

L'stdout és de la teva comanda. Tota la sortida d'Envilder va a stderr, així que envilder exec -- node print.js > out.json només escriu a out.json la sortida de la teva comanda. Si tot va bé, Envilder mostra una sola línia de resum que només anomena el programa, perquè els arguments poden contenir secrets:

envilder: 2 secrets resolved (aws, profile=dev) → npm …

Casos d'ús habituals

En tots els casos els valors només existeixen a l'entorn de la teva comanda i dels processos que iniciï, Envilder no crea mai cap fitxer .env, i el codi de sortida de la teva comanda passa a ser el codi de sortida d'Envilder. El que la comanda faci després amb els valors depèn d'ella: Docker, per exemple, desa l'entorn d'un contenidor a les seves metadades al disc (visibles amb docker inspect) fins que s'elimina el contenidor.

Arrenca LocalStack amb el seu token d'autenticació

Quan et cal: LocalStack necessita LOCALSTACK_AUTH_TOKEN i no vols el token en un fitxer .env ni a l'historial de la shell.

envilder.jsonjson
{
  "LOCALSTACK_AUTH_TOKEN": "/envilder/development/localstack/authToken"
}

Amb Docker Compose, fes referència a la variable al compose.yaml. Compose n'agafa el valor de l'entorn on s'executa, així que no cal cap fitxer .env:

compose.yamlyaml
services:
  localstack:
    image: localstack/localstack:stable
    ports:
      - "4566:4566"
    environment:
      LOCALSTACK_AUTH_TOKEN: ${LOCALSTACK_AUTH_TOKEN}
envilder exec -- docker compose up

Amb Docker sol, -e NOM sense valor copia la variable de l'entorn del client docker, així que el token no apareix mai a la línia d'ordres:

envilder exec -- docker run --rm -e LOCALSTACK_AUTH_TOKEN -p 4566:4566 localstack/localstack:stable

Trobaràs la mateixa configuració amb Testcontainers (TypeScript, Python, .NET) i Aspire a envilder-examples

Tests d'integració que arrenquen contenidors

Quan et cal: els teus tests arrenquen contenidors (per exemple, amb Testcontainers) i llegeixen un token o unes credencials de l'entorn (process.env, os.environ, Environment.GetEnvironmentVariable) per passar-los-hi.

envilder exec -- npm test
envilder exec -- dotnet test
envilder exec -- pytest

Si els tests fallen, se'n conserva el codi de sortida i la CI continua fallant. Si un secret no es pot resoldre, els tests no s'inicien i el codi de sortida és 125.

Migracions de base de dades i scripts puntuals

Quan et cal: una eina de migracions o un script necessita DATABASE_URL una sola vegada, i no vols la cadena de connexió al disc. Fes servir --map per executar la mateixa comanda contra un altre entorn.

envilder.jsonjson
{
  "DATABASE_URL": "/my-app/development/database/url"
}
envilder exec -- npx prisma migrate deploy
envilder exec -- python scripts/backfill.py

Terraform i altres eines IaC

Quan et cal: una variable d'entrada de Terraform conté un secret. Terraform llegeix les variables d'entorn TF_VAR_<nom> com a valors de la variable d'entrada <nom>.

envilder.jsonjson
{
  "TF_VAR_db_password": "/my-app/development/database/password"
}
envilder exec -- terraform plan

Declara la variable amb sensitive = true perquè Terraform l'amagui a la sortida del plan. Terraform continua desant a l'estat els valors que escriu als recursos, així que protegeix l'estat com sempre.

Servidor de desenvolupament local amb scripts de package.json

Quan et cal: tothom a l'equip ha d'arrencar l'aplicació amb els mateixos secrets executant npm run dev.

package.jsonjson
{
  "scripts": {
    "dev": "envilder exec -- next dev"
  }
}

Afegeix envilder com a dependència de desenvolupament (npm install --save-dev envilder) perquè l'script el trobi a node_modules/.bin.

Un pas de GitHub Actions

Quan et cal: un pas d'un workflow necessita els secrets, i només aquest pas. Configura les credencials d'AWS amb OIDC i executa la teva comanda amb npx envilder exec:

permissions:
  id-token: write # Required for OIDC
  contents: read

steps:
  - uses: actions/checkout@v5
  - uses: aws-actions/configure-aws-credentials@v5
    with:
      role-to-assume: arn:aws:iam::123456789012:role/GitHubActionsRole
      aws-region: us-east-1
  - run: npx envilder exec -- npm test

Els valors resolts es registren a l'emmascarament de logs de GitHub abans que s'iniciï la comanda, i els passos següents no els veuen.

Diverses comandes amb els mateixos secrets

Quan et cal: vols encadenar comandes o continuar treballant en una shell que tingui els secrets.

envilder exec -- sh -c 'npm run migrate && exec npm start'
envilder exec -- bash

Posa tot l'script de sh -c entre cometes simples perquè la teva shell no executi el && fora d'envilder exec. L'exec davant de l'última comanda substitueix la shell per aquesta comanda, així que els senyals que reenvia Envilder arriben directament a npm start. A la shell interactiva, totes les comandes que executis veuen els secrets; escriu exit per sortir-ne.

Comportament

Codis de sortida

Els codis de sortida segueixen els de GNU env i docker run, així pots distingir un error d'Envilder del codi de sortida de la teva comanda:

CodiSignificat
nLa teva comanda ha acabat amb el codi n
128 + nLa teva comanda ha estat aturada pel senyal n (per exemple, 137 per SIGKILL)
125Envilder ha fallat abans d'iniciar la comanda: opcions incorrectes, comanda absent, cap map file, secrets no resolts o credencials caducades
126La comanda existeix però el sistema operatiu n'ha impedit l'execució (per exemple, Permission denied)
127No s'ha trobat la comanda

Els modes pull i push continuen sortint amb 1 quan fallen.

Fail-closed

El mode pull avisa i se salta un secret que falta. El mode exec mai inicia la teva comanda amb un conjunt de secrets incomplet: si algun secret falta, és buit o no es pot llegir (per exemple, per accés denegat), la comanda no s'inicia, Envilder llista les variables afectades amb les rutes emmascarades i surt amb 125. Els valors es resolen una sola vegada, quan s'inicia la comanda.

Entorn

La teva comanda hereta tot l'entorn de l'intèrpret que executa Envilder, més totes les variables del map file. Mana el map file: quan una variable heretada té el mateix nom que una de mapada, la comanda rep el valor del proveïdor, i Envilder mostra els noms (mai els valors) a stderr:

Overriding inherited variables: API_KEY

Envilder no inicia cap intèrpret d'ordres addicional: els arguments arriben a la teva comanda com una llista. Però la teva pròpia shell interpreta la línia abans, així que posa entre cometes el que no ha d'interpretar: '$DB_URL' o '&&' entre cometes simples arriben literalment a la comanda, mentre que un $DB_URL sense cometes s'expandeix amb el valor de la teva shell (no amb el secret resolt) i un && sense cometes executa una segona comanda fora d'envilder exec. Si necessites funcions de la shell amb els secrets, inicia'n una explícitament:

envilder exec -- sh -c 'echo $DB_URL'

Emmascarament a GitHub Actions

Quan GITHUB_ACTIONS=true, Envilder registra cada valor resolt a l'emmascarament de logs de GitHub (::add-mask::), de manera que els valors que imprimeixi la teva comanda surten emmascarats al log del job. Tots els registres s'escriuen a stderr abans que s'iniciï la comanda; si algun no es pot escriure, la comanda no s'inicia (codi de sortida 125). La GitHub Action d'Envilder no ofereix el mode exec: executa la CLI des d'un pas run.

- run: npx envilder exec -- npm test

No redirigeixis l'stderr d'envilder exec fora del log del pas (per exemple, amb 2> fitxer o 2>/dev/null): és d'allà d'on el runner llegeix les màscares. El runner llegeix stdout i stderr per canals separats, així que un valor que la teva comanda imprimeixi de seguida pot arribar al log, en casos rars, abans que se n'hagi processat la màscara.

Senyals

stdin, stdout i stderr s'hereten i es conserva el TTY, així que els REPL, els intèrprets i les preguntes interactives funcionen com sempre. El Ctrl+C d'un terminal arriba directament a la teva comanda. SIGTERM i SIGHUP (per exemple, de docker stop o Kubernetes) es reenvien a la comanda, i Envilder espera que acabi, sense cap temps límit propi, abans de retornar-ne el codi de sortida. Els senyals només arriben al fill directe: un llançador com npm s'ha d'encarregar d'aturar els seus propis fills.

⚠️
No és un sandbox. El mode exec no crea mai cap fitxer .env i no toca els que ja existeixen: si véns del mode pull, esborra tu mateix el teu .env antic. No aïlla el procés. La teva comanda i tots els processos que iniciï poden llegir els secrets del seu entorn, inclosa qualsevol eina o agent d'IA de programació que hi executi env o printenv. A Linux, altres processos del mateix usuari poden llegir /proc/<pid>/environ. Executa només comandes de confiança amb els secrets que mapes.
💡
Exemples executables. Arrenca LocalStack amb envilder exec docker run, amb el token d'autenticació resolt des d'AWS SSM sense cap fitxer .env (Docker el desa a les metadades del contenidor fins que s'elimina), o segueix pas a pas push, pull i exec amb npx envilder: envilder-examples · cli

Guia completa de la comanda exec a GitHub: detalls de Windows, recuperació SSO i tots els missatges d'error