Pular para conteúdo

🐳 Como usar .env com Docker Compose corretamente

Este guia explica como usar arquivos .env com o Docker Compose, especialmente quando o .env está fora da raiz do projeto, como na pasta config/.


✅ Objetivo

Permitir que o Docker Compose e seus containers usem variáveis de ambiente definidas em um arquivo .env localizado em config/.env.


🚫 O Problema com ${VARIAVEL} e env_file:

env_file:
  - config/.env

environment:
  POSTGRES_USER: ${POSTGRES_USER}
  POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}

Nesse exemplo, ${POSTGRES_USER} não será resolvido a partir do config/.env. O Docker Compose tenta buscar essas variáveis do ambiente do seu sistema operacional (host), e não do env_file:.


✅ Soluções possíveis

✅ Opção 1: Usar somente env_file: (mais simples e recomendado)

services:
  db:
    image: postgres:14
    container_name: container_postgres_financeiro
    env_file:
      - config/.env

📌 Não use ${VAR} dentro de environment: nesse caso.


✅ Opção 2: Mover o .env para a raiz do projeto

Estrutura:

.
├── .env
├── docker-compose.yml
services:
  db:
    image: postgres:14
    container_name: container_postgres_financeiro
    environment:
      POSTGRES_USER: ${POSTGRES_USER}
      POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}
      POSTGRES_DB: ${POSTGRES_DB}

✅ O Docker Compose carrega automaticamente .env da raiz do projeto.


✅ Opção 3: Usar flag --env-file no comando

Mantém o .env na pasta config/, e executa com:

docker-compose --env-file config/.env up --build
services:
  db:
    image: postgres:14
    container_name: container_postgres_financeiro
    environment:
      POSTGRES_USER: ${POSTGRES_USER}
      POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}
      POSTGRES_DB: ${POSTGRES_DB}

✅ O Compose carrega as variáveis do .env como se estivessem no ambiente do host.


🧠 Comparativo final

Situação ${VAR} funciona? env_file: necessário? Observações
.env na raiz do projeto Auto-carregado pelo Compose
env_file: com .env em subpasta Só passa para o container
Usando --env-file na linha de comando Precisa especificar manualmente no comando

✅ Recomendado para seu caso

Se você quer manter .env dentro da pasta config/, use:

  • Apenas env_file: no docker-compose.yml
  • Ou --env-file config/.env no comando

Feito com 💙 por ChatGPT