Cronjobs in einem Docker-Container

Ich verwende aktuell die Nextcloud Version 27.0.2 in einem Docker Container und das alles auf einem RPi 4 mit 4GB…

unter den Grundeinstellungen, wird mir angezeigt, dass die Cronjobs nicht ausgeführt werden, dazu habe ich zwar bereits einige Sachen im WWW gelesen und ausprobiert (was ich schon alles ausprobiert habe, weiß ich im Detail nicht mehr, da es schon ca. 3-4Monate so läuft/lief), jedoch keine die funktioniert hat, zumindest bei mir.

Einmal den Weg über einen separatem Container, diesen Lösungsweg habe ich nicht verfolgt, da mir dies nicht der richtige weg zu sein scheint… (klingt für mich ehr nach einer “quick and dirty” Lösung, außerdem hab ich noch nicht ganz geblickt, was es genau damit auf sich hat)

Dann der Weg über dem Host-System, dort folgenden Cronjob hinzuzufügen:
*/5 * * * * docker exec -u www-data <container-name> php /var/www/html/cron.php

(bei <container-name> habe ich folgendes eingetragen: nextcloud-app-1

Doch laut Nextcloud ist der letzte ausgeführte cronjob länger als 17min her… .

Ich will sicherlich nicht alles vorgekaut bekommen, allerdings im www habe ich nichts gefunden was mir wirklich dabei weiter hilft.

Der Cron-Container ist der richtige Weg, dies zu tun. Aus diesem Grund ist im Docker-Image der zusätzliche Cron-Einstiegspunkt vorhanden.

Durch diesen Ansatz bleibt alles in Ihrer Docker Compose-Datei in sich geschlossen (sauber).

Fügen Sie einfach einen „Cron“-Container zu Ihrem Compose hinzu. Es sollte das gleiche Bild und die gleichen „Volumes“ wie Ihr „App“-Container haben. Die einzige Anpassung ist: Fügen Sie das Feld „entrypoint“ hinzu, das „/cron.sh“ angibt:

The cron container is the way to do it. That is why the extra cron entrypoint exists in the Docker image.

This approach keeps everything self-contained (cleanly) in your Docker Compose file.

Just add a cron container to your Compose. It should have the same image and volumes as your app container. The only adjustment is: add the entrypoint field that specifies /cron.sh:

[...]
  app:
    depends_on:
      - db
      - redis
    image: nextcloud:27-apache
    restart: unless-stopped
    ports:
      - [..]:80
    environment:
      - [..]
    volumes:
      - app-var-www-html:/var/www/html
    networks:
      - app-network

  cron:
    depends_on:
      - db
      - redis
      - app
    image: nextcloud:27-apache
    restart: unless-stopped
    volumes:
      - app-var-www-html:/var/www/html
    entrypoint: /cron.sh
    networks:
      - app-network
[...]
2 Likes

Danke für die Erklärung und ganz grob meine ich es verstanden zu haben, aber was genau ist mit “Cron-Einstiegspunkt…” gemeint und warum bedarf es einen separaten Container?
Ist etwa dieser “ENTRYPOINT” gemeint?!
image

Ich würde nur sehr ungern etwas umsetzen/ausprobieren, dass ich nicht wirklich/gänzlich verstanden habe… :flushed:

Meine Nextcloud Docker-Compose sieht wie folgt aus:

version: '2'

volumes:
  nextcloud:
  db:

services:
  db:
    image: yobasystems/alpine-mariadb:latest
    command: --transaction-isolation=READ-COMMITTED --binlog-format=ROW
    restart: always
    volumes:
      - db:/var/lib/mysql
    environment:
      - MYSQL_ROOT_PASSWORD=*****
      - MYSQL_PASSWORD=*****
      - MYSQL_DATABASE=nextcloud
      - MYSQL_USER=nextcloud

  app:
    image: nextcloud
    ports:
      - 8888:80
    links:
      - db
    volumes:
      - /media/HDD1/Nextcloud/Files/AppData/Config/ncdata:/var/www/html #Change 'nextcloud' to your external drive volume if available


    restart: always

Ohne alle verrückt zu machen, nun wird mir zumindest angezeigt, dass die Cronjobs laufen (siehe Screenshot) aber dann verstehe ich noch nicht, warum der letzte Cronjob vor 9min lief und nicht vor ca.2-5min?!

deine docker-compose enthält immer noch keinen cron service…?

aber egal hier ist das offizielle cron example und weiter ausführliche Diskussionen in diesem Forum sind einfach über cron Tag erreichbar.

Docker verfolgt die alte Unix Philisophie - “ein tool ein Zweck” (sinnggemäs). Es gibt keine Nachteile beim Resourcenverbrauch wenn man dasgleiche Image mehrfach mit unterschiedlichen “entrypoints”=Parametern startet… wobei der Weg über die crontab des Docker hosts auch OK sein sollte

1 Like

Das mit den Cronjob funktioniert jetzt zwar, allerdings hängt sich nun mein Rpi4 für ca. 30min. auf, wenn ich während des Cronjobs auf die Cloud zugreife… :open_mouth: