gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 11:59:03 24 4
gpt4 key购买 nike

我使用 docker-compose 来提升堆栈。

相关代码:

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

Postgres 的 Dockerfile:

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

Cron 根本不启动脚本。如何解决?


最终版本

根据@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. 当您更改 cron 配置时,您需要重新加载 cron 服务。

建议:

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

这种方法的优点:

  1. 所有容器的统一配置。

  2. 避免在多个容器中运行多个 cron 服务(更好地利用系统资源并减少管理开销。

  3. 荣誉 微服务 哲学。

关于postgresql - 如何通过容器内的 cron 转储数据库?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41476485/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com