1
resposta

[Bug] Erro ao subir Postgres no Docker durante CI

Erro ao subir Postgres no Docker durante CI

Durante a configuração de uma pipeline, o container do Postgres não
iniciava e retornava o erro:

There appears to be PostgreSQL data in:
/var/lib/postgresql/data (unused mount/volume)

O que estava acontecendo?

O docker-compose tinha um volume montado assim:

volumes:
  - ./postgres-data:/var/lib/postgresql/data

Isso funciona bem localmente porque queremos persistência.

Porém, em ambiente de CI:

  • O banco deve ser descartável
  • Não precisamos manter dados
  • O volume pode conter dados antigos
  • O container detecta inconsistência e aborta

Ou seja, o problema não era o banco.
Era a persistência indevida no ambiente de pipeline.


Solução aplicada

Separar ambiente local e CI usando docker-compose.override.yml.

docker-compose.yml (base -- usado na CI)

Sem volume:

services:
  postgres:
    image: postgres

docker-compose.override.yml (apenas local)

Com persistência:

services:
  postgres:
    volumes:
      - ./postgres-data:/var/lib/postgresql

Insira aqui a descrição dessa imagem para ajudar na acessibilidade

Resultado

  • CI passou a subir o banco normalmente
  • Ambiente local continuou persistindo dados
  • Pipeline ficou limpa e previsível

Aprendizado

CI não deve depender de estado anterior.

Banco em pipeline é infraestrutura temporária, não armazenamento
permanente.


Garantindo que o Postgres esteja pronto antes dos testes

Mesmo após subir o container isso não garante que o banco já está pronto para aceitar conexões.

Solução: aguardar o banco ficar disponível

Adicione um passo na pipeline para esperar o Postgres responder:

- name: Wait for Postgres
  run: |
    for i in {1..30}; do
      docker compose exec -T postgres pg_isready -U root -d root && exit 0
      sleep 2
    done
    docker compose logs postgres
    exit 1
1 resposta

Oi, Leandro! Como vai?

Agradeço por compartilhar.

Gostei da sua análise sobre a separação entre ambiente local e CI. Você deixou claro que CI não deve depender de estado anterior, e que o banco na pipeline é infraestrutura temporária, o que está totalmente alinhado com boas práticas de integração contínua. A solução com docker-compose.override.yml mostra maturidade na organização de ambientes.

Continue aprofundando essa visão de isolamento e previsibilidade nas pipelines, isso faz muita diferença em projetos reais.

Conteúdos relacionados
Alura Conte com o apoio da comunidade Alura na sua jornada. Abraços e bons estudos!