2017-01-05 2 views
1

Я использую docker-compose, который поднимает стек.Как сбрасывать DB через cron внутри контейнера?

Относительная код:

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 на просто не запускает скрипт. Как это исправить?


FINAL VERSION

на основе @Farhad Фарахи ответа, ниже конечный результат:

На хосте я сделал скрипт:

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

Этот скрипт добавляет хрон задача, которая запускает сценарий backup.sh (см. выше) в контейнере.

Для реализации этого нет необходимости использовать Dockerfile для Postgres, поэтому соответствующая часть 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 «s и использовать docker exec для запуска периодических задач.

Преимущества такого подхода:

  1. Единая конфигурация для всех контейнеров.

  2. Избегает Запуск нескольких cron услуг в нескольких контейнерах (Better использование системных ресурсов, как хорошо, как меньше затрат на управление.

  3. отличием Microservices философии.
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 

и я добавил файл /db_backups/script/backup.sh в Postgres Image Docker с содержанием:

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