介绍
The Riverside Archive 可以连接 PostgreSQL,但目录网站在一次性导入完成前就启动了。你将补上缺失的业务依赖:只有成功导入后才能开放目录;如果输入无效,目录必须保持从未启动的状态。
请先完成 Wait for the Archive Database,或掌握其中的 YAML、健康检查、Compose 项目、日志及限定范围的全新数据重启。无需 SQL 或应用编程。本实验准备独立的数据库、源数据和参考服务,不需要之前 VM 的文件。提供的初始数据库已有针对最终 TCP 监听器的正确健康检查。
使用 Workstation、Reference Archive、Your Archive 和 Collection Notes。记录为合成数据。公开说明的延迟用于展示训练状态;真正决定结果的是实际就绪状态和导入退出状态。包含阅读和普通错误在内,预计约 45 分钟;这是作者估计。
仅在导入成功后开放目录
本步骤将让目录等待导入完成,证明真实失败会阻止目录启动,然后使用原始输入恢复。
比较数据库就绪与业务就绪
从 Reference Archive 开始。搜索 Market morning,打开两条匹配记录,下载各自不同的文字稿。使用 Back to collection 返回,并查看 Ferry voices。Your Archive 不可用,而 Collection Notes 无需读取任何已导入行,就能介绍集合。
切换到 Workstation,从 /home/labex/project/archive-opening 开始:
cd /home/labex/project/archive-opening
cat compose.yaml
docker compose -p archive ps -a
docker compose -p archive logs importer catalog
数据库变为健康,导入器也完成实际工作。但目录过早尝试读取表,已因 relation "entries" does not exist 等错误退出。数据库接受连接,不代表应用数据已经存在。网站刻意不设置隐藏的启动重试,因此必须通过依赖表达此要求。
本环境与上一个引导实验使用相同的四个角色及端口关系。db 已有 TCP 健康检查,importer 等待 service_healthy。剩余问题是 catalog.depends_on.importer.condition: service_started。它允许导入进程刚开始就启动目录,此时公开说明的六秒训练延迟和真实事务尚未完成。
为真正使用数据的服务设置条件
将该条件替换为 service_completed_successfully。它检查成功完成,而不仅是进程结束:非零导入状态必须阻止目录启动。一次性导入器 Exited 0 是正确状态,不应强行保持 Running 或配置无休止的重启策略。保持 welcome 独立,因为静态集合说明无需导入后的表。
完整的按字面保存的 here-document 保留所有提供的设置及已有的数据库健康检查。与上个实验一样,> 只替换 compose.yaml;加引号的标记保证内容按字面保存:
cat > compose.yaml <<'COMPOSE'
services:
db:
image: dk04-postgres:16
environment:
POSTGRES_USER: archivist
POSTGRES_PASSWORD: training-archive
POSTGRES_DB: archive
TRAINING_DB_DELAY: "8"
volumes:
- data:/var/lib/postgresql/data
- ./scenario/slow-init.sh:/docker-entrypoint-initdb.d/10-training-delay.sh:ro
healthcheck:
test: ["CMD", "pg_isready", "-h", "127.0.0.1", "-U", "archivist", "-d", "archive"]
interval: 1s
timeout: 2s
retries: 40
importer:
image: dk04-archive:1
entrypoint: ["python3", "-B", "/app/importer.py"]
environment:
PGHOST: db
PGUSER: archivist
PGPASSWORD: training-archive
PGDATABASE: archive
TRAINING_IMPORT_DELAY: "6"
volumes:
- ./scenario:/scenario:ro
depends_on:
db:
condition: service_healthy
catalog:
image: dk04-archive:1
entrypoint: ["python3", "-B", "/app/archive.py", "catalog"]
environment:
PGHOST: db
PGUSER: archivist
PGPASSWORD: training-archive
PGDATABASE: archive
ARCHIVE_TITLE: "The Riverside Archive"
ports:
- "8090:8080"
depends_on:
importer:
condition: service_completed_successfully
welcome:
image: dk04-archive:1
entrypoint: ["python3", "-B", "/app/archive.py", "notes"]
environment:
ARCHIVE_TITLE: "The Riverside Archive"
ports:
- "8091:8080"
volumes:
data:
labels:
labex.course: dk04
COMPOSE
docker compose -p archive config
如果解析失败,先根据所示文本块修正报告的缩进,再启动服务。保持提供的应用、导入器、CSV、认证和端口不变。
证明失败导入无法开放目录
提供的 compose.bad.yaml 是覆盖配置,将导入器指向独立的无效 CSV。其中记录 ID 含文本,而真实 PostgreSQL 表要求整数。导入器使用真实事务并传递数据库的非零状态,不会假装成功。原始有效场景保持完好。
先按之前所学检查学员卷,确认项目/课程标签:
docker volume inspect archive_data --format '{{json .Labels}}'
预期 com.docker.compose.project: archive 和 labex.course: dk04。下一条命令刻意只删除本项目的一次性训练数据,防止无效输入测试借用之前导入的表:
docker compose -p archive down --volumes
两个 -f 参数按顺序合并常规配置与提供的覆盖配置。由于导入器以非零状态退出,下一次启动预期会以原生状态 1 失败:
docker compose -f compose.yaml -f compose.bad.yaml -p archive up -d --pull never --no-build
docker compose -f compose.yaml -f compose.bad.yaml -p archive ps -a
docker compose -f compose.yaml -f compose.bad.yaml -p archive logs importer
阅读无效整数错误。数据库可以保持健康,导入器以非零代码 Exited,目录应为 Created,从未启动。欢迎服务仍运行。目录启动后崩溃是另一种结果:那意味着它被允许使用失败的导入。
切换到 Your Archive 并刷新:目录应不可用。切换到 Collection Notes:独立页面仍可使用。这些是真实服务状态,不是预设的成功展示。
使用有效输入恢复并查看记录
切换到 Workstation。清理前再次确认相同的课程卷标签:
docker volume inspect archive_data --format '{{json .Labels}}'
docker compose -f compose.yaml -f compose.bad.yaml -p archive down --volumes
不使用覆盖文件启动,回到原始有效输入。这个新数据存储必须从头导入:
docker compose -p archive up -d --pull never --no-build
docker compose -p archive ps -a
docker compose -p archive logs importer
预期数据库 Healthy、导入器 Exited 0,两个 Web 角色都 Running。遇到普通路径缺失或 YAML 错误,返回指定工作目录,阅读 compose config 或服务日志,修正可编辑配置,并仅重复本课程限定范围内的重启。不要编辑源数据行、压制错误或通过重置 VM 掩盖问题。
切换到 Your Archive 并刷新。搜索 Market morning:应显示两个具有不同 ID、年份、类别和故事的记录。分别打开并使用 Download transcript,再通过 Back to collection 返回。搜索 Ferry,打开 Ferry voices 并下载文字稿。清空搜索,显示全部四条记录。也要检查 The shared garden 及其下载。未知记录 URL 应显示 Record not found,与连接失败或目录不可用区分开。
完成的目录保留全部四个身份,包括两条不同的 Market morning 记录:

切换到 Collection Notes:独立欢迎页必须仍可使用。Reference Archive 应继续提供原始完整集合。保持最终档案馆运行。检查先观察实时数据库、已完成导入和完整业务结果,再将未修改的健康/依赖配置用于独立、一次性的全新数据存储,配合不同的已披露训练延迟及无效导入样本。这些 fixture 绝不会初始化或修复你的实时档案馆。另一个隔离测试会在没有数据库服务器的情况下运行未修改的健康命令;它必须拒绝该不可用端点。
总结
你区分了可用的数据库与成功生成的目录。现在使用数据的服务会等待导入器以状态 0 退出,在真实导入失败后保持未启动,并在恢复有效输入后开放完整的新目录。独立欢迎页在整个过程中始终可用。



