私はdocker-compose
を使用しています。cronの中にDBをダンプするには?
相対コード:
db:
build: ./dockerfiles/postgres
container_name: postgres-container
volumes:
- ./dockerfiles/postgres/pgdata:/var/lib/postgresql/data
- ./dockerfiles/postgres/backups:/pg_backups
Dockerfile Postgresのための:
FROM postgres:latest
RUN mkdir /pg_backups && > /etc/cron.d/pg_backup-cron && echo "00 22 * * * /backup.sh" >> /etc/cron.d/pg_backup-cron
ADD ./backup.sh/
RUN chmod +x /backup.sh
backup.sh
#!/bin/sh
# Dump DBs
now=$(date +"%d-%m-%Y_%H-%M")
pg_dump -h db -U postgres -d postgres > "/pg_backups/db_dump_$now.sql"
# remove all files (type f) modified longer than 30 days ago under /pg_backups
find /pg_backups -name "*.sql" -type f -mtime +30 -delete
exit 0
のCr単にスクリプトを起動しません。それを修正するには?
以下@Farhad Farahiの回答に基づいてFINAL VERSION
は、最終的な結果である:
ホスト上で、私は、スクリプトを作っ:
#!/bin/bash
# Creates Cron Job which backups DB in Docker everyday at 22:00 host time
croncmd_backup="docker exec -it postgres-container bash -c '/pg_backups/backup.sh'"
cronjob_backup="00 22 * * * $croncmd_backup"
if [[ $# -eq 0 ]] ; then
echo -e 'Please provide one of the arguments (example: ./run_after_install.sh add-cron-db-backup):
1) add-cron-db-backup
2) remove-cron-db-backup'
# In order to avoid task duplications in cron, the script checks, if there is already back-up job in cron
elif [[ $1 == add-cron-db-backup ]]; then
(crontab -l | grep -v -F "$croncmd_backup" ; echo "$cronjob_backup") | crontab -
echo "==>>> Backup task added to Cron"
# Remove back-up job from cron
elif [[ $1 == remove-cron-db-backup ]]; then
(crontab -l | grep -v -F "$croncmd_backup") | crontab -
echo "==>>> Backup task removed from Cron"
fi
このスクリプトは、cronのを追加しますタスクをホストする。このスクリプトは、コンテナ内のスクリプトbackup.sh
(上記を参照)を起動する。 Postgres
ためDockerfile
を使用する必要がない。この実装では
、docker-compose.yml
のように関連する部分は次のようになります。
version: '2'
services:
db:
image: postgres:latest
container_name: postgres-container
volumes:
- ./dockerfiles/postgres/pgdata:/var/lib/postgresql/data
- ./dockerfiles/postgres/backups:/pg_backups