Cron-Jobs mit Ofelia - der saubere Weg für Container-Scheduler
Cron-Jobs mit Ofelia - der saubere Weg für Container-Scheduler
Ofelia ist ein Job-Scheduler speziell für Docker — er führt Befehle in anderen Containern aus und protokolliert die Ergebnisse sauber.
Warum nicht einfach Cron?
Cron im Container zu betreiben bedeutet: ein Prozess-Manager im Container, Logs die nicht zu docker logs gehen, kein Restart-Handling, keine Integration mit dem Docker-Lebenszyklus. Ofelia löst all das.
Grundsetup
services:
ofelia:
image: mcuadros/ofelia:latest
restart: unless-stopped
volumes:
- /var/run/docker.sock:/var/run/docker.sock:ro
depends_on:
- myapp
myapp:
image: myapp:latest
labels:
ofelia.enabled: "true"
ofelia.job-exec.cleanup.schedule: "@daily"
ofelia.job-exec.cleanup.command: "php artisan schedule:run"
Ofelia liest Docker-Labels und registriert automatisch die definierten Jobs.
Job-Typen
job-exec — Befehl in laufendem Container
Der häufigste Typ: Ofelia führt einen Befehl in einem bereits laufenden Container aus.
labels:
ofelia.job-exec.backupdb.schedule: "0 2 * * *" # täglich 2 Uhr
ofelia.job-exec.backupdb.command: "pg_dump -U postgres mydb > /backup/dump.sql"
job-run — Neuen Container starten
Startet einen temporären Container, führt den Befehl aus, entfernt ihn wieder:
labels:
ofelia.job-run.report.schedule: "@weekly"
ofelia.job-run.report.image: "python:3.11-slim"
ofelia.job-run.report.command: "python /scripts/report.py"
ofelia.job-run.report.volume: "/host/scripts:/scripts"
job-local — In Ofelia selbst
Führt einen Shell-Befehl direkt im Ofelia-Container aus:
# In ofelia.ini oder Compose-Labels:
# [job-local "prune"]
# schedule = @daily
# command = docker system prune -f
job-service-run — Swarm Services
Nur relevant für Docker Swarm: startet einen temporären Service.
Konfigurationsdatei statt Labels
Für komplexere Setups ist eine ofelia.ini übersichtlicher:
[job-exec "laravel-scheduler"]
schedule = "* * * * *"
container = myapp
command = php artisan schedule:run
no-overlap = true
[job-exec "clear-cache"]
schedule = "@hourly"
container = myapp
command = php artisan cache:clear
[job-run "backup"]
schedule = "0 3 * * *"
image = alpine
command = sh -c "tar -czf /backup/data.tar.gz /data"
volume = /hostdata:/data,/hostbackup:/backup
services:
ofelia:
image: mcuadros/ofelia:latest
volumes:
- /var/run/docker.sock:/var/run/docker.sock:ro
- ./ofelia.ini:/etc/ofelia/config.ini
command: daemon --config=/etc/ofelia/config.ini
Wichtige Optionen
| Option | Bedeutung |
|--------|-----------|
| no-overlap = true | Nächster Lauf startet nicht, wenn vorheriger noch läuft |
| on-error = backoff | Exponentielles Backoff bei Fehlern |
| retries = 3 | Anzahl Wiederholungsversuche |
Logs prüfen
docker logs ofelia
Ofelia loggt jeden Job-Start, Ergebnis (exit code), Laufzeit und Fehler — alles in einem zentralen Stream.
Cron-Syntax
Ofelia nutzt Standard-Cron plus praktische Shortcuts:
@hourly = 0 * * * *
@daily = 0 0 * * *
@weekly = 0 0 * * 0
@monthly = 0 0 1 * *
@every 30s = alle 30 Sekunden
Zusammenfassung
Ofelia ist der sauberste Weg, regelmäßige Aufgaben in Docker-Containern auszuführen: keine Cron-Daemons im Container, saubere Logs, Docker-native Integration über Labels oder Konfigurationsdatei, und volle Kontrolle über Parallelität und Fehlerbehandlung.