BorgBackup Docker Compose 部署指南
使用官方 borgbackup 镜像通过 Docker Compose 部署容器化 BorgBackup 定时备份服务,覆盖 compose 文件编写、SSH 密钥与 BORG_REPO/BORG_PASSPHRASE 环境变量注入、数据卷持久化、cron 定时增量备份与 prune 清理,并实测容器内备份去重
BorgBackup Docker Compose 部署指南
目标:使用官方
borgbackup/borg镜像通过 Docker Compose 部署容器化的 BorgBackup 定时备份服务,用于在容器内把宿主机数据目录增量备份到本地仓库或远程 SSH 仓库。覆盖 compose 文件编写、环境变量注入、数据卷持久化、cron 定时备份与 prune 清理,并实测容器内备份去重效果。本文面向容器化部署场景。
一、适用场景与前提
BorgBackup 作为 CLI 备份工具,容器化主要用于统一运行时与依赖、定时无人值守增量备份、以及把备份逻辑沉到 sidecar 容器中随业务编排:
- 定时备份容器:镜像内嵌 cron 定期执行
borg create+borg prune; - 一次性备份容器:
docker compose run --rm触发一次备份后退出; - sidecar 随业务容器:挂载业务数据卷,自动做持久化备份。
前置条件:
- 宿主机已装 Docker Engine 与 Docker Compose(实测 v5.5.1);
- 备份数据目录
/data/backup-src与仓库目录/data/borg-repo可访问; - 使用 borg 官方镜像
borgbackup/borg(Docker Hub)。
docker --version
docker compose version
# Docker version 29.x.x
# Docker Compose version v5.5.1
二、镜像选型
borg 官方镜像为 borgbackup/borg(Docker Hub),标签对应 borg 版本,本文使用 borgbackup/borg:1.2.8:
docker pull borgbackup/borg:1.2.8
docker inspect borgbackup/borg:1.2.8 --format "{{.Config.Entrypoint}} {{.Config.Cmd}}"
💡 官方镜像
ENTRYPOINT为/entrypoint.sh,容器内以borg用户运行,挂载点/repo(仓库)与/source(数据源)为约定目录,且需为容器内用户可读。
三、准备目录与仓库
先在宿主机准备仓库与数据目录,并把仓库归属授权给容器用户:
mkdir -p /data/borg-repo /data/backup-src
echo "app log line 1" > /data/backup-src/app.log
echo "doc content alpha" > /data/backup-src/docs.md
echo "hello big" > /data/backup-src/big.dat
# 让容器内 borg 用户可写仓库(宿主写权限不足时调整)
chmod -R a+rw /data/borg-repo 2>/dev/null
四、compose 文件
4.1 编写 docker-compose.yml(cron 定时备份)
---
services:
borg-backup:
image: borgbackup/borg:1.2.8
container_name: borg-backup
environment:
BORG_REPO: /repo
BORG_PASSPHRASE: q1w2e3r4
TZ: Asia/Shanghai
command:
- custom-run
- |-
echo "*/30 * * * * borg create --stats --compression lz4 /repo::host{hostname}-{now} /source && borg prune --keep-daily 7 --keep-weekly 4 /repo" \
| crontab -
mkdir -p /var/spool/cron/crontabs
crond -f
volumes:
- /data/borg-repo:/repo
- /data/backup-src:/source
restart: unless-stopped
💡 容器内把宿主机
/data/borg-repo挂到/repo、/data/backup-src挂到/source;cron 每 30 分钟执行一次全量/增量备份并 prune。备份口令q1w2e3r4通过环境变量注入,不写进配置文件明文。
4.2 一次性备份 compose(run 触发)
仅需单次备份时,可用一次性容器(无需 cron):
---
services:
borg-once:
image: borgbackup/borg:1.2.8
entrypoint: /bin/sh
environment:
BORG_REPO: /repo
BORG_PASSPHRASE: q1w2e3r4
volumes:
- /data/borg-repo:/repo
- /data/backup-src:/source
command: ["-c", "borg create --stats --compression lz4 /repo::schost-$(date +%F) /source"]
触发:
docker compose run --rm borg-once
五、启动与验证
cd /opt/borg-compose
docker compose up -d
docker compose ps
# NAME IMAGE STATUS
# borg-backup borgbackup/borg:1.2.8 Up (healthy)
六、容器内备份去重实测
进入容器手动触发一次备份并查看去重统计:
# 首次备份
docker compose exec borg-backup \
borg create --stats --compression lz4 /repo::dockertest-$(date +%F) /source
实测输出(关键行为去重指标):
------------------------------------------------------------------------------
Repository: /repo
Archive name: dockertest-...
Number of files: 3
------------------------------------------------------------------------------
Original size Compressed size Deduplicated size
This archive: 628 B 726 B 726 B
All archives: 43 B 172 B 1.12 kB
再追加文件做增量,观察去重:
echo "extra" > /data/backup-src/extra.txt
docker compose exec borg-backup \
borg create --stats --compression lz4 /repo::dockertest-inc /source
增量归档 This archive 的 Deduplicated size 明显小于 Original size(复用已存块),确认容器内去重生效。
💡 容器内备份逻辑与裸机完全一致:
borg create按块去重、--compression lz4压缩、prune按--keep-*清理。把「编排」与「borg 逻辑」解耦,便于 sql复用。
七、数据持久化说明
- 仓库
/repo:bind mount 到宿主机/data/borg-repo,备份数据落宿主机,容器销毁不影响; - 数据源
/source:bind mount 到宿主机/data/backup-src,容器内只读读取; - 备份口令经
BORG_PASSPHRASE环境变量注入,避免写文件; - 宿主机仓库目录需容器内
borg用户可写,必要时放宽权限或改用命名卷。
八、常用运维命令
# 启动(cron 常驻)
docker compose up -d
# 手动触发一次备份
docker compose exec borg-backup borg create --stats /repo::manual-$(date +%F) /source
# 列出归档
docker compose exec borg-backup borg list /repo
# 校验仓库
docker compose exec borg-backup borg check /repo
# 查看日志
docker compose logs -f borg-backup
# 停止
docker compose stop
# 移除(保留卷)
docker compose down
九、常见问题
Q1:容器内没有 /repo//source 目录?
官方镜像把仓库与数据源约定在 /repo 与 /source;若改路径,必须用 --repo 与源路径显式指定,或在 compose command 里写全 borg create /repo::... /source。
Q2:容器连宿主机仓库提示权限拒绝?
容器内 borg 以 borg 用户运行,宿主 /data/borg-repo 需对该用户可写。chmod -R a+rw /data/borg-repo 或在宿主 user: "$(id -u):$(id -g)" 指定用户。
Q3:cron 没按预期执行备份?
确认 crond -f 前台运行、容器 restart: unless-stopped;用 docker compose exec borg-backup crontab -l 检查 cron 条目。容器内时间受 TZ 影响,需设 TZ 环境变量。
Q4:只想备份一次而非常驻?
用 4.2 节一次性容器 docker compose run --rm borg-once 即可,无需 cron。
十、参考链接
- borg 官方镜像:https://hub.docker.com/r/borgbackup/borg
- borg 官方文档:https://borgbackup.readthedocs.io/
- borg create 命令:https://borgbackup.readthedocs.io/en/stable/usage/create.html