I have a question on best practices for populating data for a docker container from a remote server. Thanks in advance for any help/tips/recommendations on the “best practice” way to accomplish this.
This is what I currently have (and it works fine as-is, but I’m looking for “best practices”):
On the docker host server (outside of docker), I’m using a systemd timer to fire off a daily job that rsyncs content from a different server onto the docker server. This directory of data is bind mounted into a docker container. The systemd host job does the rsync and then restarts the docker container, because the container does not automatically pick up the changes from the rsync. I don’t know if this is an issue with docker, or an issue for the app running in the docker container (calibre-web). But restarting the container gives the app access to anything new that comes across from the rsync.
I am wondering if there is a better way to accomplish the task above. Maybe another container that does the rsync into a docker volume that is shared with the container that runs the app (replacing the bind mount with a docker volume)? That then begs the question of “How do I set up a container to routinely run an rsync job to a remote server?” Do I set up cron/systemd inside the rsync container, or do I do that outside, at the docker host level?
If anyone cares, here is my current setup (forgive any newbie mistakes - I’m just learning docker and systemd - what I have works, but may not be optimal):
version: '3' networks: frontend: driver: bridge services: www: image: linuxserver/letsencrypt container_name: letsencrypt ports: - 80:80 - 443:443 volumes: - /var/opt/docker/letsencrypt/config:/config environment: - EMAILemail@example.com - URL=blahblahblah.blah.net - VALIDATION=http - TZ=America/Denver - PUID=65534 - PGID=65534 networks: - frontend depends_on: - books restart: always books: image: linuxserver/calibre-web container_name: calibre-web volumes: - /var/opt/docker/calibre-web/config:/config - /var/opt/calibre:/books environment: - PUID=1002 - PGID=1001 networks: - frontend restart: unless-stopped
Note: linuxserver/letsencrypt uses NGINX as a reverse proxy and authentication for the calibre-web container.
One the docker host, outside of docker, /usr/local/sbin/rsync_calibre_books.sh:
#!/bin/bash /usr/bin/rsync -avzh --password-file=/root/credentials/rsync.calibre.credentials --chown=calibre:calibre rsync://firstname.lastname@example.org:873/files/ /var/opt/calibre/ /bin/sleep 2 /usr/bin/docker container restart calibre-web
One the docker host, outside of docker, /etc/systemd/system/rsync_calibre.service:
[Unit] Description=Rsync Calibre books from 10.192.0.2 to /var/opt/calibre/ [Service] Type=simple ExecStart=/usr/local/sbin/rsync_calibre_books.sh [Install] WantedBy=default.target
One the docker host, outside of docker, /etc/systemd/system/rsync_calibre.timer:
[Unit] Description=Timer to Rsync Calibre books from 10.192.0.2 RefuseManualStart=no RefuseManualStop=no [Timer] Persistent=true OnBootSec=120 OnCalendar=*-*-* 03:00:00 Unit=rsync_calibre.service [Install] WantedBy=timers.target