(三十一)组合来源、采集任务与查询服务
# 项目文件:catalog_project/compose.yaml
# 迁移作为一次性动作,查询进程启动后不再同时修改表结构。
services:
migrate:
build: .
command: ["catalog", "migrate"]
volumes: ["catalog-data:/app/instance"]
healthcheck:
disable: true
source:
build: .
command: ["catalog", "source", "--host", "0.0.0.0"]
environment:
HEALTH_URL: http://127.0.0.1:8780/health/live
ports: ["127.0.0.1:8780:8780"]
web:
build: .
depends_on:
migrate:
condition: service_completed_successfully
volumes: ["catalog-data:/app/instance"]
ports: ["127.0.0.1:8781:8781"]
restart: unless-stopped
collector:
build: .
profiles: ["jobs"]
command: ["catalog", "collect"]
environment:
CATALOG_SOURCE: http://source:8780/catalog?page=1
depends_on:
source:
condition: service_healthy
migrate:
condition: service_completed_successfully
volumes: ["catalog-data:/app/instance"]
healthcheck:
disable: true
volumes:
catalog-data:build: . 使用当前目录的 Dockerfile;command 覆盖镜像默认命令。migrate 是执行成功后结束的一次性任务,source 和 web 长期运行,collector 采完本批就退出。
depends_on 的条件说明等待什么:查询服务等待迁移成功结束;采集任务还要等来源服务健康。profiles: ["jobs"] 将采集归为按需任务,显式运行 collector 时启动它。条件的执行关系见 Compose 启动顺序文档。
# 在 catalog_project 中构建镜像,启动来源和查询服务;迁移会作为依赖先完成。
docker compose up --build -d source web
# 按需执行一次采集,使用服务名 source 访问同一 Compose 网络里的网页。
docker compose run --rm collector
# 查看运行状态和应用日志,再从宿主机请求查询接口。
docker compose ps
docker compose logs --tail 50 web
curl "http://127.0.0.1:8781/api/books?finished=0&page=2"
容器内 http://source:8780 中的 source 是 Compose 服务名。写成 127.0.0.1 会指向采集容器自己。宿主机访问则走 127.0.0.1:8781,由端口映射进入查询容器。
catalog-data 同时挂到迁移、采集和查询服务,指向 /app/instance。查询连接以 SQL 只读方式打开,但 WAL 连接可能仍需要访问共享内存文件,因此这里让卷正常读写,业务路由只执行查询。
# 先在卷内产生数据库备份,文件保留在 catalog-data 中。
docker compose run --rm collector catalog backup instance/books-backup.sqlite3
# 再把备份复制到宿主机,并保存原始快照目录。
docker compose cp web:/app/instance/books-backup.sqlite3 ./books-backup.sqlite3
docker compose cp web:/app/instance/archives ./archives-backup
# 停止并移除服务容器;命名卷继续保存。
docker compose down
备份留在同一个卷中,还不能应对卷本身丢失。复制到另一存储位置后,按前面的新路径恢复步骤实际读一次,核对书目与最新修改。程序升级时同样先备份、执行迁移,再启动与该结构版本对应的应用。