manuais-e-documentacao-itguys/documentacao conteineres/Nivel_2/Healthchecks_Cron_Docker.md

98 lines
3.2 KiB
Markdown
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# MANUAL TÉCNICO - HEALTHCHECKS E SCRIPTS AUTOMATIZADOS NO DOCKER
**Código:** ITGINF 0011/26 | **Classificação:** RESTRITO
**Responsável:** João Pedro Toledo Gonçalves | **Data:** {{DATA_ATUAL}}
## 1. HISTÓRICO DE REVISÃO
> ⚠️ **REGRA DE OURO:**
> 1. **Autor:** João Pedro Toledo Gonçalves.
> 2. **Descrição:** Criação do documento.
| Data | Versão | Descrição | Autor |
| :--- | :--- | :--- | :--- |
| {{DATA_ATUAL}} | 1.0 | Criação Inicial | João Pedro Toledo Gonçalves |
## 2. OBJETIVO
Implementar verificações de saúde (Healthchecks) para auto-cura de aplicações e configurar tarefas agendadas (Cron) de forma compatível com conteineres.
## 3. PRÉ-REQUISITOS
- [ ] Conhecimento de Dockerfile e Docker Compose.
## 4. PASSO A PASSO (EXECUÇÃO)
**Etapa 1: Definindo HEALTHCHECK no Dockerfile**
> **NOTA:** O Docker executa esse comando periodicamente. Se falhar X vezes, marca o container como `unhealthy`.
1. Edite seu `Dockerfile`.
2. Adicione a instrução (exemplo para web server):
```dockerfile
HEALTHCHECK --interval=30s --timeout=3s --start-period=5s --retries=3 \
CMD curl -f http://localhost/ || exit 1
```
**Etapa 2: Definindo HEALTHCHECK no Compose**
1. No `docker-compose.yml`, você pode sobrescrever ou definir:
```yaml
version: '3.8'
services:
web:
image: nginx
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost"]
interval: 1m30s
timeout: 10s
retries: 3
```
**Etapa 3: Scripts Agendados (Cron)**
> ⚠️ **IMPORTANTE:** Conteineres devem ter UM processo principal. Rodar `cron` junto com `apache` no mesmo container é má prática ("Fat Container").
**Abordagem A: Container Dedicado (Sidecar)**
1. Crie um container pequeno (Alpine) só para rodar o script e sair.
2. Agende a execução desse container pelo `cron` do **HOST**.
```bash
# No crontab do HOST (crontab -e)
# Roda backup do banco postgres todo dia as 03:00
0 3 * * * docker exec meu-postgres pg_dumpall > /backups/db.sql
```
**Abordagem B: Ofelia (Job Scheduler for Docker)**
1. Use uma imagem especializada que escuta events do Docker.
```yaml
services:
ofelia:
image: mcuadros/ofelia:latest
depends_on:
- web
command: daemon --docker
volumes:
- /var/run/docker.sock:/var/run/docker.sock
web:
image: my-app
labels:
ofelia.enabled: "true"
ofelia.job-exec.datecron.schedule: "@every 10s"
ofelia.job-exec.datecron.command: "echo 'Backup process...'"
```
## 5. SOLUÇÃO DE PROBLEMAS (TROUBLESHOOTING)
**Problema 1: Container sempre em `starting`**
* **Causa:** O healthcheck nunca passa com sucesso.
* **Solução:**
1. Rode o comando do healthcheck manualmente: `docker exec -it [ID] curl ...`.
2. Verifique se o `curl`/`wget` está instalado na imagem.
**Problema 2: Cron dentro do container não roda**
* **Causa:** Variáveis de ambiente não passam automaticamente para o cron.
* **Solução:** Sempre use caminhos absolutos nos scripts e carregue as variáveis se necessário.
## 6. VALIDAÇÃO FINAL
- [ ] `docker ps` mostra status `(healthy)`?
- [ ] O comando agendado foi executado no horário previsto?