Variáveis de ambiente | .env | Swarm | Docker
- Variáveis de ambiente | .env | Swarm | Docker
1. Interpolação de variáveis (${VAR})
No arquivo docker-compose.yml, a sintaxe:
environment:
RabbitMQ__Host: ${RabbitMQ__Host}
indica que o Docker deve substituir o valor da variável no momento do deploy.
A interpolação acontece antes do serviço ser criado no Swarm.
2. Ordem de resolução das variáveis
Quando o Docker encontra ${VAR}, ele segue a seguinte prioridade:
- Variável de ambiente do sistema operacional (shell Linux, CI/CD, etc.)
- Arquivo
.envno diretório atual - Valor padrão, se definido
Exemplo com valor padrão
RabbitMQ__Port: ${RabbitMQ__Port:-5672}
3. Variáveis de ambiente do Linux
Se a variável estiver definida no sistema onde o comando é executado, ela será usada:
export RabbitMQ__Host=rabbitmq
export RabbitMQ__Port=5672
docker stack deploy -c docker-compose.yml minha_stack
⚠️ Importante:
- As variáveis precisam existir no momento do
docker stack deploy - Alterações após o deploy não afetam serviços já criados
4. Uso do arquivo .env
Funciona apenas com docker-compose, no docker swarm a abordagem de .env não funciona
O Docker também lê automaticamente um arquivo .env:
- Deve estar no mesmo diretório do
docker-compose.yml - É usado somente para interpolação local
- Não é enviado para os nós do Swarm
Exemplo de .env
RabbitMQ__Host=rabbitmq
RabbitMQ__Port=5672
RabbitMQ__UserName=admin
RabbitMQ__Password=secret
Exemplo no docker-compose.yml
environment:
RabbitMQ__Host: ${RabbitMQ__Host}
RabbitMQ__Port: ${RabbitMQ__Port}
5. Docker Swarm e segurança
❌ O que evitar
- Armazenar senhas em
.env - Commitar
.envno repositório - Usar variáveis de ambiente para dados sensíveis
6. Uso de Secrets (recomendado)
Para informações sensíveis (senhas, tokens, chaves), utilize Docker Secrets.
Criando um secret
echo "secret" | docker secret create rabbitmq_password -
Usando o secret no serviço
services:
worker:
secrets:
- rabbitmq_password
secrets:
rabbitmq_password:
external: true
Acesso no container
O secret estará disponível como arquivo:
/var/run/secrets/rabbitmq_password
No .NET:
var password = File.ReadAllText("/var/run/secrets/rabbitmq_password");
7. Diferença entre Docker Compose e Docker Swarm
| Recurso | docker-compose up | docker stack deploy |
|---|---|---|
Lê .env | ✅ | ✅ (somente no deploy) |
Distribui .env | ❌ | ❌ |
| Suporte a secrets | ❌ | ✅ |
| Produção | ❌ | ✅ |
8. Boas práticas
✔ Use .env apenas para desenvolvimento
✔ Use variáveis de ambiente para configurações não sensíveis
✔ Use Docker Secrets para dados sensíveis
✔ Versione apenas .env.example
9. Exemplo completo
version: "3.9"
services:
worker:
image: minha-imagem
environment:
ASPNETCORE_ENVIRONMENT: Production
RabbitMQ__Host: ${RabbitMQ__Host}
RabbitMQ__Port: ${RabbitMQ__Port:-5672}
secrets:
- rabbitmq_password
secrets:
rabbitmq_password:
external: true