Skip to main content

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

AspectoImpacto
PerformanceDiferença irrelevante em containers
DiscoReduz escrita
BuildImagem mais limpa
RuntimeSem impacto funcional

2. PYTHONUNBUFFERED

Definição

Controla o comportamento de buffering do stdout e stderr.

Comportamento padrão

Python utiliza buffering:

  • stdout pode 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-dir no pip
  • Minimizar escrita em disco
  • Garantir previsibilidade de logs

Resumo Técnico

VariávelObjetivoMotivação Principal
PYTHONDONTWRITEBYTECODE=1Desabilitar .pycEvitar escrita e arquivos desnecessários
PYTHONUNBUFFERED=1Log imediatoMelhor observabilidade

Essas configurações não alteram a lógica da aplicação, mas melhoram previsibilidade operacional e padronizam comportamento em ambientes containerizados.