一行命令备份容器中的数据卷

前言

之前在创建miniflux容器时使用了官方的docker-compose.yml配置:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
services:
miniflux:
image: miniflux/miniflux:latest
ports:
- "80:8080"
depends_on:
db:
condition: service_healthy
environment:
- DATABASE_URL=postgres://miniflux:secret@db/miniflux?sslmode=disable
- RUN_MIGRATIONS=1
- CREATE_ADMIN=1
- ADMIN_USERNAME=admin
- ADMIN_PASSWORD=test123
db:
image: postgres:15
environment:
- POSTGRES_USER=miniflux
- POSTGRES_PASSWORD=secret
- POSTGRES_DB=miniflux
volumes:
- miniflux-db:/var/lib/postgresql/data
healthcheck:
test: ["CMD", "pg_isready", "-U", "miniflux"]
interval: 10s
start_period: 30s
volumes:
miniflux-db:

后来注意到官方配置用到了命名数据卷miniflux-db,这样做的好处是可以在多个容器之间共享数据库目录,而实际上并共享读取数据库目录的需求,并且这样做的缺点是如果系统出问题时很可能来不及备份docker的数据卷,或者干脆就忘了。而数据库中有长期订阅积攒下来的大量rss链接和文章,这是一份宝贵的数据,完全可以拿来做知识库什么的,如果丢失了就得不偿失了。

然后在网上找了一下资料,翻了几页,方法千篇一律都是创建临时容器、挂载目录、tar压缩打包,然后再用容器解包。后来自己看了下docker命令,发现一条命令就能解决:

1
docker cp miniflux-db-1:/var/lib/postgresql/data $(pwd)/miniflux-db/

在docker-compose.yml所在目录下创建一个miniflux-db作为docker ps命令的复制目的目录,miniflux-db-1是miniflux数据库的容器名,执行后会复制到当前目录下的miniflux-db目录。

这时修改docker-compose.yml中的条目:

1
2
3
4
db:
volumes:
# - miniflux-db:/var/lib/postgresql/data
- ./miniflux-db:/var/lib/postgresql/data

然后可以删除配置中数据卷的定义(用不上了):

1
2
volumes:
miniflux-db:

更多内容请关注我的博客