Introducción
The Common Archive guarda cuatro registros del barrio en PostgreSQL. Su sitio de referencia funciona, pero el nuevo archivo intentó importar su catálogo antes de que la base de datos pudiera aceptar conexiones. Haz fiable el primer inicio distinguiendo un contenedor en ejecución de una base de datos utilizable.
Debes conocer los conceptos básicos de Docker, los registros de contenedores, los puertos publicados y las rutas de terminal. Este laboratorio enseña relaciones YAML, el pequeño archivo Compose, una comprobación de salud de base de datos y condiciones de dependencia. No se requiere SQL, administración de PostgreSQL ni programación de aplicaciones. Se proporcionan la imagen completa de base de datos, el importador, el sitio web y los datos.
Usa Workstation, Reference Archive, Your Archive y Collection Notes. Todos los materiales son registros didácticos sintéticos. Las demoras deliberadas de base de datos e importación permiten ver los estados de inicio; no afirman tiempos de producción. Calcula unos 45 minutos, incluidos la lectura y los errores habituales; es una estimación del autor.
Espera a una base de datos utilizable
En este paso, repararás una dependencia de una aplicación pequeña y completa. Recorre las observaciones antes de sustituir la configuración.
Usa el archivo normal
Empieza en Reference Archive. Busca Market morning con Search the collection y Search. Dos registros comparten ese título, pero representan historias distintas. Abre ambos, inspecciona sus ID, años y categorías y usa Download transcript. Vuelve con Back to collection, borra la búsqueda e inspecciona Ferry voices. Las descargas son texto real de los registros de la base de datos, no marcadores de finalización.
Cambia a Your Archive. Explica que el catálogo no está en ejecución; no toma prestada la referencia. Collection Notes ya funciona porque ese servicio de bienvenida no lee filas de base de datos. Que un contenedor esté Up no demuestra que el catálogo esté completo.
Lee el inicio fallido real
La colección de referencia contiene cuatro registros; las dos entradas Market morning tienen identidades separadas:

Cambia a Workstation, que comienza en /home/labex/project/archive-startup. cd vuelve a esa carpeta si hace falta. cat muestra archivos:
cd /home/labex/project/archive-startup
cat compose.yaml
Compose lee YAML. La sangría agrupa las propiedades de cada servicio; usa espacios, no tabulaciones. Las cuatro entradas bajo services: son:
| Servicio | Trabajo real | Estado correcto |
|---|---|---|
db |
PostgreSQL almacena los registros | En ejecución y aceptando conexiones TCP |
importer |
Una única transacción importa el CSV proporcionado | Terminado con estado 0 |
catalog |
Busca y sirve registros y transcripciones | En ejecución después de una importación correcta |
welcome |
Sirve Collection Notes sin leer la base de datos | Puede ejecutarse antes de la importación |
image selecciona una imagen preparada. entrypoint inicia un programa proporcionado; no lo editas. environment pasa ajustes con nombre a ese programa. PGHOST, PGUSER, PGPASSWORD y PGDATABASE indican a los clientes qué base de datos y cuenta de práctica usar. Estas credenciales limitadas al escenario se proporcionan para este laboratorio. POSTGRES_* prepara esa cuenta en un almacén de datos nuevo. No cambies la autenticación ni sustituyas la base de datos.
El volumen data conserva los archivos de base de datos de este proyecto. La ruta relativa ./scenario enlaza la carpeta de entrada proporcionada al importador en modo de solo lectura, indicado por :ro. La base de datos también lee su script didáctico de demora del primer inicio. El puerto publicado 8090:8080 conecta Your Archive con el catálogo. La página de bienvenida usa un puerto separado. Un proyecto Compose agrupa recursos; en los comandos que se muestran a continuación, -p archive siempre selecciona únicamente tu proyecto de archivo como alumno, mientras que la referencia usa otro proyecto y otro volumen.
ps -a incluye contenedores detenidos y nunca iniciados. logs lee su salida real:
docker compose -p archive ps -a
docker compose -p archive logs db importer
La base de datos termina indicando que está lista, pero el importador ya falló al conectar. Que la base de datos esté lista más tarde no repite automáticamente una importación fallida. El catálogo sigue sin iniciarse porque su dependencia proporcionada ya espera el éxito del importador.
PostgreSQL usa brevemente un servidor temporal de inicialización antes de iniciar su escucha TCP final. Comprobar solo su socket Unix local puede indicar disponibilidad demasiado pronto para otro contenedor. pg_isready informa si un servidor acepta conexiones; no demuestra que las credenciales o el contenido del catálogo sean correctos.
La siguiente sonda de solo lectura usa intencionadamente el puerto TCP incorrecto. exec ejecuta la sonda en db, -T desactiva la asignación de terminal, -h elige la dirección, -p elige el puerto y -U/-d nombran el usuario y la base de datos proporcionados. No hay servidor en el puerto 6543, por lo que debes esperar no response y el estado de salida nativo 2:
docker compose -p archive exec -T db pg_isready -h 127.0.0.1 -p 6543 -U archivist -d archive
Es un fallo de la sonda, no una pérdida de datos del catálogo. La base de datos final escucha en su puerto TCP normal 5432. La comprobación de salud debe dirigirse a ese servicio real.
Expresa la disponibilidad e inicia con datos nuevos
Conserva sin cambios la configuración de la aplicación y los archivos proporcionados. Añade un healthcheck real a db y cambia la condición de base de datos del importador de service_started a service_healthy. test es el comando que Docker ejecuta dentro del contenedor de base de datos. El arreglo similar a JSON usa CMD para ejecutar directamente el programa nombrado, sin shell. -h 127.0.0.1 selecciona la escucha TCP final; el puerto predeterminado es 5432. interval: 1s, timeout: 2s y retries: 40 proporcionan sondas repetidas con límites, no una espera fija que finja que la base de datos está lista.
La condición service_completed_successfully del catálogo permanece: una importación única correcta termina con 0 y no necesita seguir Running. Su fallo debe bloquear el catálogo. La página de bienvenida no depende de la importación porque no necesita datos importados.
El siguiente here-document literal escribe la configuración completa para reproducir la sangría. cat proporciona las líneas, > sustituye solo compose.yaml y el marcador COMPOSE entre comillas impide la expansión del shell hasta su línea de cierre. Se conserva el resto de la configuración de la aplicación:
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 Common 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 Common Archive"
ports:
- "8091:8080"
volumes:
data:
labels:
labex.course: dk04
COMPOSE
Analiza la configuración antes de cambiar recursos de ejecución:
docker compose -p archive config
Si falla YAML, lee la línea indicada, restaura el bloque mostrado con espacios y vuelve a analizar. No reinicies repetidamente un archivo mal formado.
Ahora prueba un primer inicio con un almacén de datos vacío del curso. Esto elimina intencionadamente solo tu base de datos de práctica desechable, no el CSV fuente ni el archivo de referencia. Inspecciona primero las etiquetas del volumen real:
docker volume inspect archive_data --format '{{json .Labels}}'
Confirma que com.docker.compose.project sea archive y que labex.course sea dk04. Si alguna difiere, detente e inspecciona el proyecto en lugar de eliminar otro recurso. down --volumes elimina únicamente los contenedores, la red y el volumen de datos declarado de este proyecto Compose nombrado:
docker compose -p archive down --volumes
up -d inicia servicios en segundo plano. --pull never usa las imágenes preparadas; --no-build impide sustituirlas por nuevas construcciones:
docker compose -p archive up -d --pull never --no-build
docker compose -p archive ps -a
docker compose -p archive logs importer
Espera una base de datos saludable, un importador Exited 0 y un catálogo y página de bienvenida Running. Las demoras proporcionadas de primer inicio e importación son explícitamente didácticas. Ninguna espera fija en tu archivo Compose sustituye la disponibilidad real ni una importación correcta. Si un intento anterior dejó contenedores fallidos, inspecciona sus registros, corrige la configuración, verifica las etiquetas del volumen del curso y repite este inicio limitado con datos nuevos.
Usa el catálogo completo
Cambia a Your Archive y recarga. Busca Market morning: deben aparecer dos registros con distintos ID, años, categorías e historias. Abre cada uno y usa Download transcript, volviendo con Back to collection. Busca Ferry, abre Ferry voices y descarga su transcripción. Borra la búsqueda para mostrar los cuatro registros. Inspecciona también The shared garden y su descarga. Una URL de registro desconocida debe mostrar Record not found, distinto de un fallo de conexión o un catálogo no disponible.
Cambia a Collection Notes: su página independiente de bienvenida debe seguir disponible. Reference Archive debe seguir ofreciendo la colección completa original. Mantén tu archivo final en ejecución. Las comprobaciones observan primero tu base de datos real, la importación terminada y los resultados completos del funcionamiento. Después ejecutan tus opciones de salud y dependencia sin modificar en almacenes nuevos, separados y desechables, con distintas demoras didácticas declaradas y una muestra de importación inválida. Esos escenarios de prueba nunca inicializan ni reparan tu archivo real. Otra prueba aislada ejecuta tu comando de salud sin modificar sin ningún servidor de base de datos; debe rechazar ese destino no disponible.
Resumen
Distinguiste el inicio del contenedor de base de datos de la disponibilidad TCP final, configuraste una comprobación de salud real y exigiste que el importador la esperara. Después, un almacén de datos nuevo recibió el catálogo completo antes de que se abriera su consumidor, mientras la página de notas independiente seguía disponible.



