
prodrigestivill/postgres-backup-local,因此VFAT、EXFAT、SMB/CIFS等文件系统无法与此docker镜像一起使用。
Docker:
shdocker run -u postgres:postgres -e POSTGRES_HOST=postgres -e POSTGRES_DB=dbname -e POSTGRES_USER=user -e POSTGRES_PASSWORD=password prodrigestivill/postgres-backup-local
Docker Compose:
yamlservices: postgres: image: postgres restart: always environment: - POSTGRES_DB=database - POSTGRES_USER=username - POSTGRES_PASSWORD=password # - POSTGRES_PASSWORD_FILE=/run/secrets/db_password <-- POSTGRES_PASSWORD的替代方案(用于docker secrets) pgbackups: image: prodrigestivill/postgres-backup-local restart: always user: postgres:postgres # 可选:详见下文 volumes: - /var/opt/pgbackups:/backups links: - postgres depends_on: - postgres environment: - POSTGRES_HOST=postgres - POSTGRES_DB=database - POSTGRES_USER=username - POSTGRES_PASSWORD=password # - POSTGRES_PASSWORD_FILE=/run/secrets/db_password <-- POSTGRES_PASSWORD的替代方案(用于docker secrets) - POSTGRES_EXTRA_OPTS=-Z1 --schema=public --blobs - SCHEDULE=@daily - BACKUP_ON_START=TRUE - BACKUP_KEEP_DAYS=7 - BACKUP_KEEP_WEEKS=4 - BACKUP_KEEP_MONTHS=6 - HEALTHCHECK_PORT=8080
出于安全考虑,建议以postgres:postgres用户运行。
若以postgres用户运行,系统管理员需按以下方式初始化目标文件夹权限:
sh# 对于默认镜像(debian) mkdir -p /var/opt/pgbackups && chown -R 999:999 /var/opt/pgbackups # 对于alpine镜像 mkdir -p /var/opt/pgbackups && chown -R 70:70 /var/opt/pgbackups
大多数变量与官方postgres镜像相同。
| 环境变量 | 描述 |
|---|---|
| BACKUP_DIR | 保存备份的目录。默认为/backups。 |
| BACKUP_SUFFIX | 备份文件的后缀名。默认为.sql.gz。 |
| BACKUP_ON_START | 若设为TRUE,则在容器每次启动或重启时执行备份。默认为FALSE。 |
| BACKUP_KEEP_DAYS | 保留每日备份的数量,超过则删除旧备份。默认为7。 |
| BACKUP_KEEP_WEEKS | 保留每周备份的数量,超过则删除旧备份。默认为4。 |
| BACKUP_KEEP_MONTHS | 保留每月备份的数量,超过则删除旧备份。默认为6。 |
| BACKUP_KEEP_MINS | last文件夹中备份的保留分钟数,超过则删除。默认为1440。 |
| BACKUP_LATEST_TYPE | latest指针的类型(symlink:符号链接,hardlink:硬链接,none:无)。默认为symlink。 |
| VALIDATE_ON_START | 若设为FALSE,则启动时不验证配置。不建议禁用。默认为TRUE。 |
| HEALTHCHECK_PORT | 用于cron调度健康检查的监听端口。默认为8080。 |
| POSTGRES_DB | 逗号或空格分隔的postgres数据库列表,用于指定要备份的数据库。若设置了POSTGRES_CLUSTER,此处指用于转储全局对象和发现其他应转储数据库的连接数据库(通常为postgres或template1)。必填。 |
| POSTGRES_DB_FILE | POSTGRES_DB的替代方案,每行一个数据库,用于docker secrets。 |
| POSTGRES_EXTRA_OPTS | pg_dump的额外选项(若设置POSTGRES_CLUSTER,则为pg_dumpall的选项)。默认为-Z1。 |
| POSTGRES_CLUSTER | 设为TRUE时使用pg_dumpall。此时需将POSTGRES_EXTRA_OPTS设为任意值或空,因为默认值与pg_dumpall不兼容。 |
| POSTGRES_HOST | postgres连接参数;要连接的postgres主机。必填。 |
| POSTGRES_PASSWORD | postgres连接参数;用于连接的postgres密码。必填。 |
| POSTGRES_PASSWORD_FILE | POSTGRES_PASSWORD的替代方案,用于docker secrets。 |
| POSTGRES_PASSFILE_STORE | passfile格式的POSTGRES_PASSWORD替代方案,用于postgres集群。 |
| POSTGRES_PORT | postgres连接参数;要连接的postgres端口。默认为5432。 |
| POSTGRES_USER | postgres连接参数;用于连接的postgres用户。必填。 |
| POSTGRES_USER_FILE | POSTGRES_USER的替代方案,用于docker secrets。 |
| SCHEDULE | 指定postgres备份间隔的cron调度表达式。默认为@daily。 |
| TZ | 指定用于计算SCHEDULE cron的POSIX TZ变量(例如"Europe/Paris")。 |
| WEBHOOK_URL | 备份错误或成功后调用的URL(POST请求,JSON payload,详见hooks/00-webhook文件)。默认禁用。 |
| WEBHOOK_ERROR_URL | 备份失败时调用的URL。默认禁用。 |
| WEBHOOK_PRE_BACKUP_URL | 备份开始时调用的URL。默认禁用。 |
| WEBHOOK_POST_BACKUP_URL | 备份成功完成时调用的URL。默认禁用。 |
| WEBHOOK_EXTRA_ARGS | webhook中curl执行的额外参数(详见hooks/00-webhook文件)。 |
这些变量不用于正常部署操作:
| 环境变量 | 描述 |
|---|---|
| POSTGRES_PORT_5432_TCP_ADDR | 当POSTGRES_HOST未设置时,用于设置POSTGRES_HOST。 |
| POSTGRES_PORT_5432_TCP_PORT | 当POSTGRES_HOST未设置时,用于设置POSTGRES_PORT。 |
首先,新备份会创建在last文件夹中,文件名包含完整时间。
备份成功完成后,会通过硬链接(而非复制,以避免占用更多空间)将其链接到其他文件夹(daily、weekly和monthly)。此步骤会替换该类别的旧备份,始终只保留每个类别的最新备份(因此每月备份存储的是该月的最新备份,而非第一个)。
备份文件夹结构如下:
BACKUP_DIR/last/DB-YYYYMMDD-HHmmss.sql.gz:所有备份单独存储在此文件夹中。BACKUP_DIR/daily/DB-YYYYMMDD.sql.gz:始终存储(硬链接)当天的最新备份。BACKUP_DIR/weekly/DB-YYYYww.sql.gz:始终存储(硬链接)当周的最新备份(由于使用ISO周编号,周末为周日)。BACKUP_DIR/monthly/DB-YYYYMM.sql.gz:始终存储(硬链接)当月的最新备份(通常为每月最后一天)。每次成功备份后,还会更新以下符号链接以便使用:
BACKUP_DIR/last/DB-latest.sql.gz -> BACKUP_DIR/last/DB-YYYYMMDD-HHmmss.sql.gz BACKUP_DIR/daily/DB-latest.sql.gz -> BACKUP_DIR/daily/DB-YYYYMMDD.sql.gz BACKUP_DIR/weekly/DB-latest.sql.gz -> BACKUP_DIR/weekly/DB-YYYYww.sql.gz BACKUP_DIR/monthly/DB-latest.sql.gz -> BACKUP_DIR/monthly/DB-YYYYMM.sql.gz
清理时,脚本仅在新备份成功后删除各分类的旧文件:
last文件夹中超过指定分钟数的文件(不影响其他备份,因为它们是硬链接)。daily文件夹中超过指定天数的文件。weekly文件夹中超过指定周数的文件(从每周结束开始计数,而非开始)。monthly文件夹中超过指定月数(按31天计)的文件(从每月结束开始计数,而非开始)。容器内的hooks文件夹可包含在不同情况下运行的钩子脚本,第一个参数为具体状态(error:错误,pre-backup:备份前,post-backup:备份后)。
只需在该文件夹中创建具有执行权限的脚本,run-parts会在每个状态变化时执行它。
作为示例,可查看已存在的实现WEBHOOK_URL功能的脚本。
默认情况下,容器每日执行备份,但可通过运行/backup.sh手动启动备份。
以下示例脚本以运行用户身份创建一个备份,并保存到工作目录:
shdocker run --rm -v "$PWD:/backups" -u "$(id -u):$(id -g)" -e POSTGRES_HOST=postgres -e POSTGRES_DB=dbname -e POSTGRES_USER=user -e POSTGRES_PASSWORD=password prodrigestivill/postgres-backup-local /backup.sh
可通过-e SCHEDULE="@daily"修改SCHEDULE环境变量来更改默认备份频率,默认为daily(每日)。
调度相关更多信息可查看此处。
daily、weekly和monthly文件夹通过硬链接创建和填充,以节省磁盘空间。
以下是恢复/应用备份的示例。
要使用同一备份容器恢复,替换以下命令中的$BACKUPFILE(备份文件路径)、$CONTAINER(容器名)、$USERNAME(用户名)和$DBNAME(数据库名):
shdocker exec --tty --interactive $CONTAINER /bin/sh -c "zcat $BACKUPFILE | psql --username=$USERNAME --dbname=$DBNAME -W"
替换以下命令中的$BACKUPFILE(备份文件路径)、$VERSION(postgres版本)、$HOSTNAME(主机名)、$PORT(端口)、$USERNAME(用户名)和$DBNAME(数据库名):
shdocker run --rm --tty --interactive -v $BACKUPFILE:/tmp/backupfile.sql.gz postgres:$VERSION /bin/sh -c "zcat /tmp/backupfile.sql.gz | psql --host=$HOSTNAME --port=$PORT --username=$USERNAME --dbname=$DBNAME -W"




manifest unknown 错误
TLS 证书验证失败
DNS 解析超时
410 错误:版本过低
402 错误:流量耗尽
身份认证失败错误
429 限流错误
凭证保存错误
来自真实用户的反馈,见证轩辕镜像的优质服务