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
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