如何通过容器内的cron转储数据库?

我使用docker-compose堆栈。

相对编码:

 db: build: ./dockerfiles/postgres container_name: postgres-container volumes: - ./dockerfiles/postgres/pgdata:/var/lib/postgresql/data - ./dockerfiles/postgres/backups:/pg_backups 

Dockerfile for 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 

克朗根本不会启动脚本。 如何解决这个问题?


最终版本

基于@Farhad Farahi的回答,下面是最终结果:

在主机上我做了一个脚本:

 #!/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 

你应该知道的事情:

  1. cron服务默认在postgres库中不会启动。

  2. 当您更改cronconfiguration时,您需要重新加载cron服务。

build议:

使用docker host的cron并使用docker exec启动周期性任务。

这种方法的优点:

  1. 所有容器的统一configuration。

  2. 避免在多个容器中运行多个cron服务(更好地使用系统资源以及减lesspipe理开销。

  3. 荣誉微服务哲学。

基于Farhad的回答,我在主机上用下一个内容创build了一个文件postgres_backup.sh

 #!/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 '/db_backups/script/backup.sh'" cronjob_backup="00 22 * * * $croncmd_backup" if [[ $# -eq 0 ]] ; then echo -e 'Please provide one of the arguments (example: ./postgres_backup.sh add-cron-db-backup): 1 > add-cron-db-backup 2 > remove-cron-db-backup elif [[ $1 == add-cron-db-backup ]]; then ( crontab -l | grep -v -F "$croncmd_backup" ; echo "$cronjob_backup" ) | crontab - echo "==>>> Backup task added to Local (not container) Cron" elif [[ $1 == remove-cron-db-backup ]]; then ( crontab -l | grep -v -F "$croncmd_backup" ) | crontab - echo "==>>> Backup task removed from Cron" fi 

我添加了一个文件/db_backups/script/backup.sh到Docker的Postgres Image,其内容如下:

 #!/bin/sh # Dump DBs now=$(date +"%d-%m-%Y_%H-%M") pg_dump -h db -U postgres -d postgres > "/db_backups/backups/db_dump_$now.sql" # remove all files (type f) modified longer than 30 days ago under /db_backups/backups find /db_backups/backups -name "*.sql" -type f -mtime +30 -delete exit 0