0

Context: I'm deploying a localhost version of a website to do some troubleshooting. It's a Django website running Mezzanine (yes it's very old, hence the debugging).

The website has a Postgres database which has been dumped via:

sudo -u postgres pg_dump --role "postgres" --format custom --blobs 
     --encoding UTF8 --verbose --no-unlogged-table-data --file /tmp/backup.bak

I have been able to restore this database on my own computer using pg_restore, however when trying to compose docker containers, the database is created but my db_init service does not seem to restore the database.

Here is the .yml file I use:

version: '3'

services:
  db:
    image: postgres:13
    environment:
      POSTGRES_DB: pg_db
      POSTGRES_USER: postgres
      POSTGRES_PASSWORD: postgres
    volumes:
      - postgres_data:/var/lib/postgresql/data
    healthcheck:
      test: ["CMD", "pg_isready", "-U", "postgres"]
      interval: 10s
      retries: 5

  db_init:
    image: postgres:13
    container_name: pg_db_init
    command: ["sh", "-c", 
              "./wait-for-it.sh db:5432 -- pg_restore --clean --if-exists \
               --no-owner --no-privileges -h db -d pg_db -U postgres /backup.bak"] 
    environment:
      POSTGRES_DB: pg_db
      POSTGRES_USER: postgres
      POSTGRES_PASSWORD: postgres
      PGPASSWORD: postgres
    volumes:
      - ./backup.bak:/backup.bak
      - ./wait-for-it.sh:/wait-for-it.sh
    depends_on:
      - db

  web:
    build: .
    command: python3 manage.py runserver 0.0.0.0:8000
    working_dir: /var/www/website.com.au    
    depends_on:
      - db
    environment:
      - DJANGO_SETTINGS=project.settings
    user: ${UID}:${GID}
    volumes:
      - .:/var/www/website.com.au
    ports:
      - "8000:8000"
    tty: true

volumes:
  postgres_data:

docker-compose.yml file creates the service database, the service db_init then tries to restore a dumped pg file into the database (yes it appears all the paths are successful) - all instances run.

No errors can be seen in the db_init container.

Here's the tail of the db container log:

2025-02-25 17:22:30 2025-02-25 09:22:30.693 UTC [1] LOG:  database system is ready to accept connections
2025-02-25 17:22:30 2025-02-25 09:22:30.913 UTC [72] ERROR:  relation "shipping_shippingcountry" does not exist at character 47
2025-02-25 17:22:30 2025-02-25 09:22:30.913 UTC [72] STATEMENT:  SELECT "shipping_shippingcountry"."code" FROM "shipping_shippingcountry" WHERE "shipping_shippingcountry"."enabled" = false ORDER BY "shipping_shippingcountry"."code" ASC
2025-02-25 17:22:32 2025-02-25 09:22:32.238 UTC [73] ERROR:  relation "shipping_shippingcountry" does not exist at character 47
2025-02-25 17:22:32 2025-02-25 09:22:32.238 UTC [73] STATEMENT:  SELECT "shipping_shippingcountry"."code" FROM "shipping_shippingcountry" WHERE "shipping_shippingcountry"."enabled" = false ORDER BY "shipping_shippingcountry"."code" ASC

These missing relations occur because the database hasn't restored any tables at all, which I checked by using the container's terminal, connecting to the Postgres database and using the \dt command

2
  • At a guess either a) ./wait-for-it.sh db:5432 is not doing what you think it is. b) Or it is and there is some error in the restore that kills it. Look in the Postgres log to see if you can see a restore error. The log may have rotated so you may need to go to a previous log. Commented Feb 25 at 18:37
  • I think wait-for-it.sh is fine. I'll put in some logging for it to check. I think you might be right that there's some kind of restore error -- or possibly an issue with my volumes. Still haven't solved it (it's been moved to a lower priority issue) but this is a good lead. Thanks! Commented Mar 14 at 5:16

0

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.