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 devOpcions
| Opció | Descripció |
|---|---|
--map | Ruta al map file (per defecte: envilder.json) |
--profile | Perfil AWS CLI. Té prioritat sobre $config.profile |
--provider | aws o azure. Té prioritat sobre $config.provider |
--vault-url | URL 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-path | Single-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 upO integra-ho als scripts del package.json:
{
"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.
{
"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:
services:
localstack:
image: localstack/localstack:stable
ports:
- "4566:4566"
environment:
LOCALSTACK_AUTH_TOKEN: ${LOCALSTACK_AUTH_TOKEN}envilder exec -- docker compose upAmb 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:stableTrobarà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 -- pytestSi 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.
{
"DATABASE_URL": "/my-app/development/database/url"
}envilder exec -- npx prisma migrate deploy
envilder exec -- python scripts/backfill.pyTerraform 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>.
{
"TF_VAR_db_password": "/my-app/development/database/password"
}envilder exec -- terraform planDeclara 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.
{
"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 testEls 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 -- bashPosa 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:
| Codi | Significat |
|---|---|
n | La teva comanda ha acabat amb el codi n |
128 + n | La teva comanda ha estat aturada pel senyal n (per exemple, 137 per SIGKILL) |
125 | Envilder ha fallat abans d'iniciar la comanda: opcions incorrectes, comanda absent, cap map file, secrets no resolts o credencials caducades |
126 | La comanda existeix però el sistema operatiu n'ha impedit l'execució (per exemple, Permission denied) |
127 | No 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_KEYEnvilder 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 testNo 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.
envilder-examples · cli