Python 现代开发学习笔记

(三十一)组合来源、采集任务与查询服务

# 项目文件: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

备份留在同一个卷中,还不能应对卷本身丢失。复制到另一存储位置后,按前面的新路径恢复步骤实际读一次,核对书目与最新修改。程序升级时同样先备份、执行迁移,再启动与该结构版本对应的应用。

笔记正文与全部题解 · Ctrl / ⌘ K