Ambiente Docker genérico para rodar scripts Python em um servidor.
Uma imagem Docker única (py-toolbox) com Python + Chromium/Playwright + bibliotecas comuns, para rodar scripts Python em um servidor sem precisar instalar as dependências diretamente no sistema operacional.
A imagem também pode ser usada pelo DockerOperator do Airflow, por exemplo, para orquestrar um script the scrape utilizando BeautifulSoup e Playwright.
Os scripts não ficam dentro da imagem. Cada projeto mantém seus próprios arquivos .py em sua própria pasta. A toolbox fornece apenas o ambiente de execução desses scripts.
Isso significa que:
- mudar um script não exige rebuild da imagem;
- a imagem só precisa ser reconstruída quando uma biblioteca nova precisa ser adicionada ou quando o próprio ambiente da toolbox é alterado.
A pasta da toolbox fica em:
/mnt/work/toolbox/
Arquivos principais:
| Arquivo | Função |
|---|---|
Dockerfile |
Define a imagem Docker (Python + Playwright + bibliotecas). |
requirements.txt |
Lista as bibliotecas Python instaladas na imagem. |
docker-run.sh |
Atalho para executar um script dentro do container. |
README.md |
Documentação da toolbox. |
A organização dos projetos é independente da toolbox. Por exemplo:
/mnt/work/
├── toolbox/
│ ├── Dockerfile
│ ├── requirements.txt
│ ├── docker-run.sh
│ └── README.md
│
├── Projeto/
│ └── scrape/
│ ├── bulk_scrape.py
│ └── faltantes.xlsx
│
└── outro-projeto/
└── script.py
Entre na pasta do projeto onde está o script:
cd /mnt/work/Projeto/scrapeExecute o script usando o docker-run.sh:
docker-run.sh bulk_scrape.py faltantes.xlsx --coluna url --saida produtos_novos.xlsxO docker-run.sh monta a pasta atual dentro do container. Por isso, ele pode ser usado a partir de qualquer projeto ou pasta do servidor.
Não é necessário copiar os scripts para dentro da toolbox.
Projeto
│
├── script.py
├── arquivos de entrada
└── arquivos de saída
│
↓
docker-run.sh
│
↓
py-toolbox
│
└── executa o script
Se um script precisar de uma biblioteca que ainda não está instalada, será exibido um erro semelhante a:
ModuleNotFoundError: No module named 'nome_da_lib'
cd /mnt/work/toolboxnano requirements.txtAdicione a biblioteca em uma nova linha.
docker build -t py-toolbox .O rebuild só é necessário quando o requirements.txt ou outro componente usado na construção da imagem for alterado.
Depois disso, a biblioteca estará disponível para qualquer script executado com a imagem py-toolbox.
O docker-run.sh está instalado em:
~/bin
Como ~/bin está no PATH do usuário, é possível executar:
docker-run.sha partir de qualquer pasta, sem precisar usar:
./docker-run.shTambém não é necessário copiar o script para cada projeto.
mkdir -p ~/bin
cp docker-run.sh ~/bin/
echo 'export PATH="$HOME/bin:$PATH"' >> ~/.bashrc
source ~/.bashrcA execução de scripts pode criar arquivos de cache __pycache__ na pasta do projeto.
Como o container roda como root por padrão, esses arquivos podem eventualmente ficar com proprietário root.
Se isso causar problemas de permissão:
sudo rm -rf __pycache__Para verificar o espaço ocupado pelas imagens:
docker imagesPara remover uma imagem antiga que não é mais utilizada:
docker rmi nome-da-imagemO requirements.txt fixa:
playwright==1.47.0
de propósito.
A imagem base utilizada pelo Dockerfile:
mcr.microsoft.com/playwright/python:v1.47.0-jammy
já contém o Chromium correspondente à versão 1.47.
Se o pacote Python playwright for instalado em uma versão diferente, por exemplo sem fixar a versão, ele poderá tentar utilizar uma versão do Chromium que não está presente na imagem.
Isso pode resultar em erro na execução.
A versão do Playwright deve ser atualizada em conjunto:
- alterar a versão da imagem base no
Dockerfile; - alterar a versão do
playwrightnorequirements.txt; - reconstruir a imagem.
As versões precisam permanecer compatíveis.
A py-toolbox foi criada para funcionar como um ambiente Python compartilhado para os projetos de automação do servidor.
A ideia é manter uma imagem simples e estável, adicionando bibliotecas que sejam úteis para mais de um projeto, desde que sejam bibliotecas simples.
Enquanto as dependências forem compatíveis entre si, todos os projetos podem utilizar a mesma imagem. Não é necessário criar uma nova imagem para cada script ou projeto.
Se, no futuro, surgirem conflitos entre versões de bibliotecas ou projetos com necessidades muito diferentes, podem ser criadas imagens derivadas ou especializadas, por exemplo:
py-toolbox
py-toolbox-scraping
py-toolbox-data
Isso só deve ser feito quando houver uma necessidade real, evitando complexidade desnecessária.
A prioridade é manter a py-toolbox simples. Novas camadas de complexidade devem ser adicionadas apenas quando resolverem um problema concreto.