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.