Se você desenvolve aplicações, gerencia bancos de dados ou constrói pipelines de dados, sabe que existe uma regra de ouro no DevOps: nunca coloque senhas, chaves de API ou credenciais diretamente no código-fonte.
Para manter nosso código limpo, seguro e portável entre ambientes (desenvolvimento, homologação e produção), nós usamos as Variáveis de Ambiente (as famosas Environment Variables ou ENVs).
No mundo dos containers, as variáveis de ambiente ganham um papel ainda mais vital. Como as imagens Docker são imutáveis (você não deve alterá-las depois de buildadas), as variáveis de ambiente são a ferramenta perfeita para customizar o comportamento da sua aplicação no momento exato em que o container é iniciado.
Neste post, vamos entender como elas funcionam e quais as três principais maneiras de passá-las na execução de um container.
O que são e como funcionam as Variáveis de Ambiente no Docker?
Pense nelas como caixas de texto com um par de CHAVE=VALOR que ficam guardadas dentro do sistema operacional do container.
Quando sua aplicação inicia (um script Python de ETL, uma API em Node.js ou um banco de dados), ela lê essas caixas para saber como deve se comportar. Por exemplo, a imagem oficial do PostgreSQL precisa saber qual senha você deseja definir para o usuário administrador. Em vez de você alterar arquivos internos de configuração, você simplesmente diz ao Docker: “Inicie este container com a variável POSTGRES_PASSWORD=minha_senha_secreta“.
Como passar Variáveis de Ambiente na execução do container
Usando a flag -e no terminal
Ideal para testes rápidos ou quando você precisa passar apenas uma ou duas variáveis diretamente no comando docker run:
docker run -d --name meu_postgres -e POSTGRES_PASSWORD=producao123 postgres:15-alpine
Você pode repetir a flag -e quantas vezes precisar no mesmo comando.
Usando um arquivo .env externo
Quando a aplicação exige muitas configurações, passar tudo na linha de comando fica inviável. Você pode criar um arquivo de texto simples chamado .env (ou meu-banco.env):
DB_HOST=db_dados DB_USER=admin DB_PASS=senha_secreta_456
E então, basta chamar esse arquivo usando a flag --env-file:
docker run -d --env-file meu-banco.env minha-api-dados
Declarando no Docker Compose
Se você já está orquestrando seus containers de forma profissional com o Docker Compose, pode injetar a propriedade environment direto no serviço do arquivo YAML:
services: web: image: nginx:alpine environment: - APP_ENV=production - DEBUG=false
Como conferir se a variável realmente entrou no container?
Ficou na dúvida se o container realmente engoliu a variável que você passou? O Docker possui um comando de inspeção muito robusto que te mostra as entranhas do container rodando no momento.
Você pode usar o comando docker inspect filtrando pelas variáveis, ou de um jeito bem mais simples e visual: “entre” no terminal do container e peça para o Linux listar as variáveis do sistema.
Esse comando vai disparar o utilitário env do Linux interno do container, listando na sua tela todas as chaves e valores injetados ativas na sessão atual.
⚠️ Dica Crítica de Segurança (.gitignore neles!): Se você optar por usar o método 2 (arquivos
.env), certifique-se imediatamente de adicionar o padrão*.envno seu arquivo.gitignoredo Git. Você quer essas variáveis rodando na sua máquina e no servidor de produção, mas nunca quer que esse arquivo seja empurrado para o seu repositório público do GitHub!
Aprender a isolar configurações de infraestrutura usando variáveis de ambiente é o que permite que uma mesma imagem Docker rode na máquina de um desenvolvedor júnior, passe por testes automatizados em uma esteira de CI/CD e termine escalando em produção dentro de um cluster Kubernetes sem mudar uma única linha de código.