Skip to main content

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:

  1. Variável de ambiente do sistema operacional (shell Linux, CI/CD, etc.)
  2. Arquivo .env no diretório atual
  3. 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

danger

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 .env no 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

Recursodocker-compose updocker stack deploy
.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