PT-BR - Um aprendizado importante sobre Docker Compose: build.args vs env_file
📚 Um aprendizado importante sobre Docker Compose: build.args vs env_file 🚀
Hoje enquanto preparava o ambiente de staging de uma aplicação, me deparei com um comportamento do Docker Compose que parecia estranho:
- Eu tinha um
.env.stagingcom todas as variáveis certinhas. - No
docker-compose.yml, já tinha configuradoenv_file: .env.staging. - Mas, durante o build da imagem, o Rails reclamava que o
SECRET_KEY_BASEnão existia. 😵💫
Fiquei alguns minutos investigando… até perceber algo que agora parece óbvio (mas que muita gente também se confunde):
👉 O env_file é lido apenas no docker-compose up, não no build!
Durante o docker-compose build, o Compose não lê o env_file.
Se queremos passar variáveis durante o build (por exemplo para compilar os assets ou configurar alguma build customizada), precisamos usar build.args explicitamente.
💡 E mais: o .env padrão (ou .env.staging, se usado com --env-file) é lido para preencher essas variáveis só se elas forem mapeadas no build.args.
🎯 Em resumo:
| Quando | Variáveis disponíveis |
|---|---|
docker-compose build |
Usar args: + --env-file (ou exportar no terminal) |
docker-compose up |
Usar env_file: (funciona perfeitamente) |
⚙️ Como ficou no meu projeto:
.env.staging:
SECRET_KEY_BASE=supersecreta123
RAILS_ENV=staging
docker-compose.yml:
build:
context: .
dockerfile: Dockerfile
args:
SECRET_KEY_BASE: ${SECRET_KEY_BASE}
RAILS_ENV: ${RAILS_ENV}
env_file:
- .env.staging
E na hora de rodar:
docker-compose --env-file .env.staging build
docker-compose --env-file .env.staging up
🧠 Pequenos detalhes como esse fazem toda a diferença quando configuramos ambientes de staging e produção com confiabilidade e previsibilidade.
#docker #devops #programação #rails #dockercompose #backend #aprendizado