- scripts/entrypoint.sh (new): prefers the live bind-mounted backup-cron.sh, but falls back to a copy baked into the image at build time if the mount is missing. If neither exists, it stays up and idle (instead of crash-looping) so the container remains reachable via console/exec for diagnosis. - scripts/backup-cron.sh (updated): resolves db-backup.sh the same live-or-fallback way, re-checked on every loop iteration, so if the bind mount comes back healthy later, this container picks up the live scripts on its next backup run with no restart needed. - scripts/backup.Dockerfile (updated): bakes all three scripts into the image under /app/scripts-default/ as the fallback, and sets the new wrapper as ENTRYPOINT.
20 lines
904 B
Docker
20 lines
904 B
Docker
# Backup sidecar image: Postgres client tools (pg_dump/psql) + openssl for
|
|
# at-rest encryption of dumps.
|
|
#
|
|
# The scripts are bind-mounted live at runtime (see the `backup` service in
|
|
# docker-compose.yml) so they can be edited without a rebuild -- but they're
|
|
# ALSO baked in here as a fallback default under /app/scripts-default/.
|
|
# entrypoint.sh prefers the live mount and only falls back to this baked-in
|
|
# copy if the mount is missing, empty, or stale. That fallback is what keeps
|
|
# a broken bind mount from crash-looping the container into an unreachable
|
|
# state (see entrypoint.sh for the full story).
|
|
FROM postgres:16-alpine
|
|
RUN apk add --no-cache openssl
|
|
|
|
COPY scripts/backup-cron.sh scripts/db-backup.sh scripts/db-restore.sh /app/scripts-default/
|
|
COPY scripts/entrypoint.sh /app/entrypoint.sh
|
|
RUN chmod +x /app/entrypoint.sh /app/scripts-default/*.sh
|
|
|
|
ENTRYPOINT ["/app/entrypoint.sh"]
|
|
CMD []
|