Introdução | Deploy | Python
- Introdução | Deploy | Python
Dockerfile
FROM python:3.12-slim
# Define diretório de trabalho
WORKDIR /app
# Variáveis para evitar .pyc e buffering
ENV PYTHONDONTWRITEBYTECODE=1
ENV PYTHONUNBUFFERED=1
# Instala dependências do sistema (necessário para psycopg)
RUN apt-get update && apt-get install -y \
build-essential \
&& rm -rf /var/lib/apt/lists/*
# Copia requirements
COPY requirements.txt .
# Instala dependências Python
RUN pip install --no-cache-dir --upgrade pip \
&& pip install --no-cache-dir -r requirements.txt
# Copia código da aplicação
COPY app ./app
# Expõe porta da API
EXPOSE 8000
# Comando padrão
CMD ["uvicorn", "app.main:app", "--host", "0.0.0.0", "--port", "8000"]
Configuração de Variáveis de Ambiente Python em Containers Docker
Objetivo
Documentar o uso das variáveis de ambiente:
ENV PYTHONDONTWRITEBYTECODE=1
ENV PYTHONUNBUFFERED=1
Essas configurações são consideradas boas práticas em aplicações Python executadas dentro de containers.
1. PYTHONDONTWRITEBYTECODE
Definição
Controla a geração de arquivos .pyc (bytecode compilado) pelo interpretador Python.
Comportamento padrão
Ao importar um módulo:
import app
O Python gera:
__pycache__/app.cpython-312.pyc
Esse arquivo contém o bytecode pré-compilado para acelerar imports subsequentes.
Configuração no Dockerfile
ENV PYTHONDONTWRITEBYTECODE=1
Efeito
- Impede a criação de arquivos
.pyc - Não cria diretórios
__pycache__ - Evita escrita desnecessária no filesystem
Justificativa em Containers
Em ambientes Docker:
- O filesystem é efêmero
- Containers são descartáveis
- Não há benefício relevante de cache persistente
- Reduz ruído na imagem
Impacto Técnico
| Aspecto | Impacto |
|---|---|
| Performance | Diferença irrelevante em containers |
| Disco | Reduz escrita |
| Build | Imagem mais limpa |
| Runtime | Sem impacto funcional |
2. PYTHONUNBUFFERED
Definição
Controla o comportamento de buffering do stdout e stderr.
Comportamento padrão
Python utiliza buffering:
stdoutpode ser line-buffered ou block-buffered- Saídas podem ser atrasadas
Exemplo:
print("Servidor iniciado")
Sem configuração adequada, essa mensagem pode não aparecer imediatamente nos logs do container.
Configuração no Dockerfile
ENV PYTHONUNBUFFERED=1
Efeito
- Desativa o buffering
- Envia saída imediatamente para
stdout - Logs aparecem em tempo real
Justificativa em Containers
Docker captura logs via:
docker logs <container>
Sem PYTHONUNBUFFERED:
- Logs podem atrasar
- Debug fica inconsistente
- Monitoramento pode perder eventos em tempo real
Com a variável ativa:
- Logs fluem imediatamente
- Melhor integração com sistemas de observabilidade
Alternativa Equivalente
python -u app.py
O parâmetro -u ativa modo unbuffered.
Exemplo Completo de Dockerfile
FROM python:3.12-slim
ENV PYTHONDONTWRITEBYTECODE=1
ENV PYTHONUNBUFFERED=1
WORKDIR /app
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
COPY . .
CMD ["python", "app.py"]
Boas Práticas Recomendadas
- Definir ambas variáveis em aplicações web
- Utilizar
--no-cache-dirno pip - Minimizar escrita em disco
- Garantir previsibilidade de logs
Resumo Técnico
| Variável | Objetivo | Motivação Principal |
|---|---|---|
PYTHONDONTWRITEBYTECODE=1 | Desabilitar .pyc | Evitar escrita e arquivos desnecessários |
PYTHONUNBUFFERED=1 | Log imediato | Melhor observabilidade |
Essas configurações não alteram a lógica da aplicação, mas melhoram previsibilidade operacional e padronizam comportamento em ambientes containerizados.