O mesmo "Hello" em Flask — imprime uma saudação e o hostname do container — entregue do jeito de 2019 e do jeito de 2026, lado a lado.
Este repositório foi um exemplo que usei em palestras e aulas entre 2018 e 2021. Em vez de atualizá-lo, preservei o original e construí a versão moderna ao lado. O aplicativo é o mesmo de propósito: o assunto é como se constrói, protege e entrega um container, não o que o app faz.
📖 docs/then-vs-now.md — o estudo de caso completo, com os números medidos e o porquê de cada decisão. 🎓 docs/aula.md — roteiro de aula de 50 minutos.
| 2019 — como era | 2026 — como é hoje |
|---|---|
|
docker build -t hello:2019 2019
docker run -p 5000:5000 hello:2019
curl localhost:5000 |
cd 2026
make build
make run
curl localhost:5000 |
Mesmo aplicativo, medido nas duas pontas:
| Publicada em 2018 | 2026 | ||
|---|---|---|---|
| Pull (comprimido) | 100,0 MiB | 42,5 MiB | −58% |
| Disco | 474 MB | 208 MB | −56% |
| CVEs com correção disponível | 50 | 0 | |
| Build a frio | 66s | 25s | −62% |
| Compilador embarcado | 73,8 MiB | 0 | |
| Usuário | root | uid 10001 | |
Sobe com Pod Security restricted |
não | sim |
A última linha é a mais direta: aplicado num namespace com Pod Security
Admission em restricted, o manifesto de 2019 é recusado e nenhum pod
sobe. Ele não é só inseguro em 2026 — não é admitido.
Reproduza você mesmo: Actions → Comparação 2019 vs 2026 → Run workflow. Roda em runner amd64 nativo e publica a tabela no resumo da execução.
Precisa de Docker, uv, Trivy, kind e kubectl.
cd 2026
make help # lista tudo
make venv test # testes
make build scan # imagem e scan de vulnerabilidade
make run # local, com o mesmo endurecimento do Kubernetes
make demo # cluster kind de 3 nós, deploy e verificação
make drain # mostra o PodDisruptionBudget segurando um dreno
make kind-down # destrói o cluster2019/ o repositório original, sem alterações
2026/ app, Dockerfile, manifestos Kubernetes e Makefile
docs/ o estudo de caso e o roteiro de aula
.github/ pipeline, comparação automatizada e Dependabot
A imagem cirolini/flask-uwsgi:latest está congelada desde 16/03/2018 e
não corresponde ao código deste repositório — ela imprime Hello World!,
enquanto o app.py imprime Hello Fullstack! desde 2021. Tem 50
vulnerabilidades com correção disponível, roda como root, e é amd64 apenas.
Ela continua publicada de propósito: é a evidência central do estudo de caso,
e derrubá-la quebraria os 23 mil downloads de quem a referencia. Não use em
produção. Se quiser rodar algo, use o 2026/.
Isso é o que uma tag latest sem procedência significa na prática: um
artefato sem dono, sem data e sem ligação com código nenhum. A versão de 2026
publica por digest, assinado, com SBOM — e a assinatura é verificável por
qualquer pessoa:
cosign verify \
--certificate-identity-regexp '^https://github.com/cirolini/Docker-Flask-uWSGI/' \
--certificate-oidc-issuer https://token.actions.githubusercontent.com \
ghcr.io/cirolini/docker-flask-uwsgi@sha256:...MIT. Material de aula de Cultura e Práticas DevOps e DevSecOps (Unisinos) — se for usar em aula, um link de volta é bem-vindo.