2017-01-05 19 views
1

私は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 

答えて

2

あなたが知っておくべき事:

  1. cronサービスが開始されていませんデフォルトではpostgresライブラリイメージにあります。

  2. cronの設定を変更すると、cronサービスを再ロードする必要があります。

勧告:

使用docker hostのcronと定期的なタスクを起動するdocker execを使用しています。このアプローチの

利点:すべてのコンテナについて

  1. 統合設定。

  2. は、システムリソースのより良い使用量が少ない管理オーバーヘッドとしてaswell(複数のコンテナに複数のcronのサービスを実行している回避。

  3. 栄誉Microservices理念。Farhadの答えに基づいて
1

私は、次のコンテンツを持つホスト上のファイル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 

を、私はコンテンツとドッカーのPostgresのイメージにファイル/db_backups/script/backup.shを追加しました:

#!/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 
関連する問題