runner inspect-args

Imprime o vetor de args que seria passado pro docker run no proximo deploy de uma app, sem executar nada. Read-only — nao toca em state, containers, networks ou imagens.

Adicionado na v2.24.1.

Sintaxe

runner inspect-args <app>
runner inspect-args <app> --instance <name>
runner inspect-args <app> --json

Quando usar

Util pra validar configuracao antes de pushar pro dist:

  • Confirmar que campos novos da v2.24.0 (resources, security, logging, etc) viram as flags certas do docker
  • Debug de porque uma app esta rodando com comportamento inesperado (compare args contra docker inspect)
  • Pre-flight check antes de deploy em producao
  • Validacao em pipelines de CI sem rodar o deploy completo

Comparativo com outros comandos:

Comando O que faz
runner inspect-args Imprime args do docker run (read-only)
runner manifest Imprime o .deploy.yml (raw ou resolvido)
runner validate Valida estrutura do manifest, env, version
runner deploy Executa deploy completo

Argumentos

Argumento Tipo Obrigatorio Descricao
app string Sim Path do app ou projeto/system
--instance <name> string Nao Instance a inspecionar. Default: instance do state file, ou primeira do .deploy.yml
--json bool Nao Output como JSON array em vez de linhas legiveis

Como funciona

O comando le o .deploy.yml da app, constroi o ContainerRunConfig usando o mesmo caminho de codigo que o deploy real usaria, e dumpa o vetor de args.

Internamente reusa a funcao preview_run_args — a mesma que a suite de regressao do runner usa pra lockar goldens. Operador ve exatamente o que o runner emitiria.

Diferenca pro deploy real: nao exercita PortAllocator (portas dinamicas), nao aplica weighted services do Traefik canary, nao puxa configuracao de auto-mount baseada em estado do disco. Para todos os campos declarados explicitamente no .deploy.yml, o output e identico ao deploy real.

Exemplos

Default (instance + version do state)

runner inspect-args meu-app
run
-d
--name meu-app_production_v1-0-4
--restart unless-stopped
-w /app
--network public
--label ccs.systems/instance=production
--label ccs.systems/managed-by=runner
--label ccs.systems/project=meu-app
--label ccs.systems/version=v1.0.4
--label traefik.http.routers.meu-app_production_v1-0-4.rule=Host(`meu-app.com.br`)
meu-app:v1.0.4

Com campos novos da v2.24.0

# .deploy.yml
resources:
  memory: 256m
  cpus: "0.5"
security:
  user: nginx
  read_only: true
logging:
  driver: json-file
  options:
    max-size: 10m
runner inspect-args meu-app
run
-d
--name meu-app_production_v1-0-4
...
--memory 256m
--cpus 0.5
--user nginx
--read-only
--log-driver json-file
--log-opt max-size=10m
meu-app:v1.0.4

Instance especifica

runner inspect-args meu-app --instance staging

Util pra comparar production vs staging quando configuracao diverge.

JSON output

runner inspect-args meu-app --json
[
  "run",
  "-d",
  "--name",
  "meu-app_production_v1-0-4",
  "--restart",
  "unless-stopped",
  "..."
]

Bom pra alimentar pipeline / diff automatico:

diff <(runner inspect-args meu-app --json) <(runner inspect-args meu-app --json --instance staging)

Workflow tipico

  1. Editar .deploy.yml local com campos novos
  2. runner inspect-args meu-app — confirma que as flags certas aparecem
  3. Commit + push pro dist
  4. Cron faz fetch + deploy

Resolução de placeholders e redação de secrets (v2.32.0+)

A partir da v2.32.0, o inspect-args resolve {{::KEY[?default]}} placeholders dos environment: antes de imprimir. Por default (sem --insecure), secrets sao redactados — operador ve <set>/<empty> no lugar do valor real.

Estado da key Sem --insecure Com --insecure
Definida em .env (plain) Valor verbatim Valor verbatim
Definida em .secrets ou bundle decifrado <set> Valor real
Ausente + ?default no YAML Default literal Default literal
Ausente + sem default <empty> <empty>

Sem isso (pre-v2.32.0), inspect-args imprimia DB_PASSWORD={{::DB_PASSWORD}} literal — operador nao distinguia "nao setado" de "redactado" e re-rodava env set achando que tinha falhado.

Exemplo prático:

# .deploy.yml
environment:
  NODE_ENV: "{{::NODE_ENV?production}}"
  BASE_DOMAIN: "{{::BASE_DOMAIN}}"
  DB_PASSWORD: "{{::DB_PASSWORD}}"
$ runner inspect-args meu-app
-e NODE_ENV=production           # default literal do YAML
-e BASE_DOMAIN=meu-app.com.br    # valor do .env (plaintext)
-e DB_PASSWORD=<set>             # redactado

$ runner --insecure inspect-args meu-app
-e NODE_ENV=production
-e BASE_DOMAIN=meu-app.com.br
-e DB_PASSWORD=s3cr3t-real-value # mostrado por --insecure

A flag --insecure reusa o mesmo flag global de runner ckeys reveal, runner tokens reveal, runner add --insecure etc. — banner de aviso + audit log em /opt/runner/logs/insecure-events.jsonl.

Auto-propagation de NEXT_PUBLIC_* (v2.32.0+)

Keys em build.args: cujo nome bate com prefixo publico conhecido — NEXT_PUBLIC_, VITE_, REACT_APP_, NUXT_PUBLIC_, EXPO_PUBLIC_, PUBLIC_ — aparecem automaticamente no output do inspect-args como -e KEY=VAL, mesmo se nao declaradas em environment:. Veja manifest schema para detalhes.

Limitacoes

  • Portas dinamicas: o comando emite -p apenas pras portas declaradas em ports: do manifest. Portas alocadas pelo PortAllocator (publish_strategy: random) sao decididas em deploy-time e nao aparecem aqui.
  • Auto-mount de data/, logs/, keys/: nao exercitado. So volumes declarados em volumes: aparecem.
  • Weighted services do Traefik canary: nao aparecem (sao escritos no dynamic config do Traefik, nao como flag do docker run).
  • Entrypoint multi-arg: o primeiro elemento vai em --entrypoint, o resto aparece depois da image no output (convencao docker: entrypoint + cmd-style args).

Exit codes

Code Significado
0 Sucesso, args impressos
1 App nao encontrada, .deploy.yml invalido, ou instance inexistente

Veja tambem

By Borlot.com.br on 03/06/2026