Aguarde o banco de dados do arquivo

DockerBeginner
Pratique Agora

Introdução

O Common Archive mantém quatro registros do bairro no PostgreSQL. Seu site de referência funciona, mas o novo arquivo tentou importar seu catálogo antes de o banco de dados aceitar conexões. Torne a primeira inicialização confiável distinguindo um contêiner em execução de um banco de dados utilizável.

Você deve conhecer Docker básico, logs de contêineres, portas publicadas e caminhos no terminal. Este laboratório ensina relações YAML, o pequeno arquivo Compose, uma verificação de integridade do banco de dados e condições de dependência. Não é necessário conhecer SQL, administração PostgreSQL nem programação de aplicações. A imagem completa do banco de dados, o importador, o site e os dados são fornecidos.

Use Workstation, Reference Archive, Your Archive e Collection Notes. Todos os materiais são registros didáticos sintéticos. Os atrasos deliberados do banco de dados e da importação tornam os estados de inicialização visíveis; não representam tempos de produção. Reserve cerca de 45 minutos para leitura e erros comuns; essa é uma estimativa do autor.

Aguarde um banco de dados utilizável

Nesta etapa, você reparará uma dependência em uma aplicação pequena e completa. Acompanhe as observações antes de substituir a configuração.

Use o arquivo em seu funcionamento normal

Comece em Reference Archive. Pesquise Market morning usando Search the collection e Search. Dois registros compartilham esse título, mas representam histórias diferentes. Abra ambos, examine seus IDs, anos e categorias e use Download transcript. Volte com Back to collection, limpe a pesquisa e examine Ferry voices. Os downloads são textos reais dos registros do banco de dados, não marcadores de conclusão.

Mude para Your Archive. Ele explica que o catálogo não está em execução; não toma emprestada a referência. Collection Notes já funciona porque esse serviço de boas-vindas não lê linhas do banco de dados. Um contêiner estar Up não comprova que o catálogo esteja completo.

Leia a falha real de inicialização

A coleção de referência contém quatro registros; as duas entradas Market morning têm identidades distintas:

O catálogo de referência completo

Mude para Workstation, que inicia em /home/labex/project/archive-startup. cd volta a essa pasta se necessário. cat mostra arquivos:

cd /home/labex/project/archive-startup
cat compose.yaml

O Compose lê YAML. A indentação agrupa as propriedades de cada serviço; use espaços, não tabulações. As quatro entradas em services: são:

Serviço Trabalho real Estado de sucesso
db O PostgreSQL armazena os registros Em execução e aceitando conexões TCP
importer Uma única transação importa o CSV fornecido Encerrado com status 0
catalog Pesquisa e serve registros e transcrições Em execução após o sucesso da importação
welcome Serve Collection Notes sem ler o banco de dados Pode executar antes da importação

image seleciona uma imagem preparada. entrypoint inicia um programa fornecido; você não o edita. environment passa configurações nomeadas a esse programa. PGHOST, PGUSER, PGPASSWORD e PGDATABASE informam aos clientes qual banco de dados e conta de treinamento usar. Essas credenciais restritas ao cenário são fornecidas para este laboratório. POSTGRES_* prepara essa conta em um novo armazenamento de dados. Não altere a autenticação nem substitua o banco de dados.

O volume data mantém os arquivos de banco de dados deste projeto. O caminho relativo ./scenario monta a pasta de entrada fornecida no importador somente para leitura, indicado por :ro. O banco de dados também lê seu script fornecido de atraso didático da primeira inicialização. A porta publicada 8090:8080 conecta Your Archive ao catálogo. A página de boas-vindas usa uma porta separada. Um projeto Compose agrupa recursos; -p archive abaixo sempre aponta para seu arquivo de aluno, enquanto a referência usa outro projeto e volume.

ps -a inclui contêineres parados e nunca iniciados. logs lê sua saída real:

docker compose -p archive ps -a
docker compose -p archive logs db importer

O banco de dados acaba informando que está pronto, mas o importador já falhou ao se conectar. Um banco de dados que fica pronto depois não repete automaticamente uma importação que falhou. O catálogo permanece sem iniciar porque sua dependência fornecida já aguarda o sucesso do importador.

O PostgreSQL usa brevemente um servidor temporário de inicialização antes de iniciar seu listener TCP final. Uma verificação apenas do socket Unix local pode indicar prontidão cedo demais para outro contêiner. pg_isready informa se um servidor aceita conexões; não comprova que as credenciais ou o conteúdo do catálogo estejam corretos.

A sondagem somente de leitura a seguir usa intencionalmente a porta TCP errada. exec executa a sondagem em db, -T desativa a alocação de terminal, -h escolhe o endereço, -p escolhe a porta e -U/-d nomeiam o usuário/banco de dados fornecidos. A porta 6543 não tem servidor; portanto espere no response e status de saída nativo 2:

docker compose -p archive exec -T db pg_isready -h 127.0.0.1 -p 6543 -U archivist -d archive

Isso é uma falha de sondagem, não perda dos dados do catálogo. O banco de dados final escuta em sua porta TCP normal 5432. Uma verificação de integridade deve acessar esse serviço real.

Expresse a prontidão e inicie com dados novos

Mantenha as configurações da aplicação e os arquivos fornecidos inalterados. Adicione um healthcheck real a db e altere a condição do banco de dados no importador de service_started para service_healthy. test é o comando que o Docker executa dentro do contêiner do banco de dados. O array semelhante a JSON usa CMD para executar diretamente o programa nomeado, sem shell. -h 127.0.0.1 seleciona o listener TCP final; a porta padrão é 5432. interval: 1s, timeout: 2s e retries: 40 fornecem sondagens repetidas e limitadas, não uma espera fixa que finge que o banco está pronto.

A condição service_completed_successfully do catálogo permanece: uma importação única bem-sucedida encerra com 0 e não precisa permanecer Running. Sua falha deve bloquear o catálogo. A página de boas-vindas não depende da importação porque não precisa de dados importados.

O here-document literal a seguir grava a configuração completa para que a indentação seja reproduzível. cat fornece as linhas, > substitui apenas compose.yaml, e o marcador COMPOSE entre aspas impede expansões do shell até sua linha de fechamento. Todas as outras configurações da aplicação são preservadas:

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

Analise a configuração antes de alterar recursos de execução:

docker compose -p archive config

Se o YAML falhar, leia a linha informada, restaure o bloco mostrado com espaços e analise novamente. Não reinicie repetidamente um arquivo malformado.

Agora teste uma primeira inicialização com um armazenamento de dados do curso vazio. Isso exclui intencionalmente apenas seu banco de treinamento descartável, não o CSV de origem nem o arquivo de referência. Examine primeiro os rótulos reais do volume:

docker volume inspect archive_data --format '{{json .Labels}}'

Confirme que com.docker.compose.project é archive e labex.course é dk04. Se algum deles diferir, pare e examine o projeto em vez de excluir outro recurso. down --volumes remove somente os contêineres, a rede e o volume de dados declarado deste projeto Compose nomeado:

docker compose -p archive down --volumes

up -d inicia os serviços em segundo plano. --pull never usa as imagens preparadas; --no-build impede substituí-las por novas construções:

docker compose -p archive up -d --pull never --no-build
docker compose -p archive ps -a
docker compose -p archive logs importer

Espere um banco de dados saudável, um importador Exited 0 e um catálogo e uma página de boas-vindas Running. Os atrasos fornecidos da primeira inicialização e da importação são explicitamente para treinamento. Nenhum sleep fixo no seu arquivo Compose substitui a prontidão real ou uma importação bem-sucedida. Se uma tentativa anterior deixou contêineres com falha, examine seus logs, corrija a configuração, verifique os rótulos do volume do curso e repita essa inicialização restrita com dados novos.

Use o catálogo completo

Mude para Your Archive e recarregue. Pesquise Market morning: devem aparecer dois registros com IDs, anos, categorias e histórias diferentes. Abra cada um e use Download transcript, voltando com Back to collection. Pesquise Ferry, abra Ferry voices e baixe sua transcrição. Limpe a pesquisa para mostrar os quatro registros. Examine também The shared garden e seu download. Uma URL de registro desconhecida deve mostrar Record not found, diferente de uma falha de conexão ou de um catálogo indisponível.

Mude para Collection Notes: sua página independente de boas-vindas deve continuar disponível. Reference Archive ainda deve oferecer a coleção original completa. Mantenha seu arquivo final em execução. As verificações primeiro observam seu banco de dados real, a importação concluída e os resultados completos do negócio. Depois executam suas escolhas inalteradas de integridade/dependências em armazenamentos de dados novos, separados e descartáveis, com diferentes atrasos didáticos informados e uma amostra de importação inválida. Esses cenários de teste nunca inicializam nem reparam seu arquivo real. Um teste isolado separado também executa seu comando de integridade inalterado sem nenhum servidor de banco de dados; ele deve rejeitar esse destino indisponível.

Resumo

Você distinguiu a inicialização do contêiner do banco de dados da prontidão TCP final, configurou uma verificação real de integridade e exigiu que o importador a aguardasse. Um novo armazenamento de dados recebeu então o catálogo completo antes de seu consumidor abrir, enquanto a página independente de notas permaneceu disponível.