Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Postgres image is not creating database

According to these docs, I can specify the name of the database created by the postgres docker image with the env var POSTGRES_DB. I have set it in my docker-compose file, but it isn't being created.

Here's relevant section from the compose file:

pg:
    image: postgres:10
    volumes:
      - db-data:/var/lib/postgresql/data
    environment:
      POSTGRES_DB: user-auth
      POSTGRES_USER: postgres
      POSTGRES_PASSWORD: postgres

Here are the logs:

Attaching to userauth_pg_1
pg_1   | 2018-02-05 18:05:54.803 UTC [1] LOG:  listening on IPv4 address "0.0.0.0", port 5432
pg_1   | 2018-02-05 18:05:54.803 UTC [1] LOG:  listening on IPv6 address "::", port 5432
pg_1   | 2018-02-05 18:05:54.806 UTC [1] LOG:  listening on Unix socket "/var/run/postgresql/.s.PGSQL.5432"
pg_1   | 2018-02-05 18:05:54.817 UTC [24] LOG:  database system was interrupted; last known up at 2018-02-05 18:03:26 UTC
pg_1   | 2018-02-05 18:05:54.942 UTC [24] LOG:  database system was not properly shut down; automatic recovery in progress
pg_1   | 2018-02-05 18:05:54.944 UTC [24] LOG:  redo starts at 0/1633ED0
pg_1   | 2018-02-05 18:05:54.944 UTC [24] LOG:  invalid record length at 0/1633F08: wanted 24, got 0
pg_1   | 2018-02-05 18:05:54.944 UTC [24] LOG:  redo done at 0/1633ED0
pg_1   | 2018-02-05 18:05:54.955 UTC [1] LOG:  database system is ready to accept connections
pg_1   | 2018-02-05 18:05:59.140 UTC [31] FATAL:  database "user-auth" does not exist
pg_1   | 2018-02-05 18:06:15.528 UTC [32] FATAL:  database "user-auth" does not exist
pg_1   | 2018-02-05 18:08:46.120 UTC [33] FATAL:  database "user-auth" does not exist
pg_1   | 2018-02-05 18:08:46.151 UTC [34] FATAL:  database "user-auth" does not exist
pg_1   | 2018-02-05 18:14:02.138 UTC [35] FATAL:  database "user-auth" does not exist
pg_1   | 2018-02-05 18:14:02.926 UTC [36] FATAL:  database "user-auth" does not exist
pg_1   | 2018-02-05 18:14:04.244 UTC [37] FATAL:  database "user-auth" does not exist
pg_1   | 2018-02-05 18:14:04.273 UTC [38] FATAL:  database "user-auth" does not exist
pg_1   | 2018-02-05 18:14:04.602 UTC [39] FATAL:  database "user-auth" does not exist
pg_1   | 2018-02-05 18:14:04.910 UTC [40] FATAL:  database "user-auth" does not exist
pg_1   | 2018-02-05 18:14:05.777 UTC [41] FATAL:  database "user-auth" does not exist
pg_1   | 2018-02-05 18:14:05.823 UTC [42] FATAL:  database "user-auth" does not exist
pg_1   | 2018-02-05 18:14:05.878 UTC [43] FATAL:  database "user-auth" does not exist
pg_1   | 2018-02-05 18:14:06.663 UTC [44] FATAL:  database "user-auth" does not exist
pg_1   | 2018-02-05 18:14:06.716 UTC [45] FATAL:  database "user-auth" does not exist
pg_1   | 2018-02-05 18:16:32.713 UTC [46] FATAL:  database "user-auth" does not exist
pg_1   | 2018-02-05 18:47:04.603 UTC [47] FATAL:  database "user-auth" does not exist
pg_1   | 2018-02-05 18:51:34.413 UTC [1] LOG:  received smart shutdown request
pg_1   | 2018-02-05 18:51:34.417 UTC [1] LOG:  worker process: logical replication launcher (PID 30) exited with exit code 1
pg_1   | 2018-02-05 18:51:34.419 UTC [25] LOG:  shutting down
pg_1   | 2018-02-05 18:51:34.434 UTC [1] LOG:  database system is shut down
pg_1   | 2018-02-05 19:08:42.934 UTC [1] LOG:  listening on IPv4 address "0.0.0.0", port 5432
pg_1   | 2018-02-05 19:08:42.934 UTC [1] LOG:  listening on IPv6 address "::", port 5432
pg_1   | 2018-02-05 19:08:42.937 UTC [1] LOG:  listening on Unix socket "/var/run/postgresql/.s.PGSQL.5432"
pg_1   | 2018-02-05 19:08:42.951 UTC [25] LOG:  database system was shut down at 2018-02-05 18:51:34 UTC
pg_1   | 2018-02-05 19:08:42.956 UTC [1] LOG:  database system is ready to accept connections
pg_1   | 2018-02-05 19:09:04.316 UTC [32] FATAL:  database "user-auth" does not exist
pg_1   | 2018-02-05 19:09:18.081 UTC [33] FATAL:  database "user-auth" does not exist
like image 866
gardenhead Avatar asked Feb 05 '18 19:02

gardenhead


Video Answer


2 Answers

You most probably started the container without the env variables set. The db was then initialized without user or DB info.

You need to delete the volume and try again.

Credit: https://github.com/docker-library/postgres/issues/453#issuecomment-393939412

like image 109
howaryoo Avatar answered Oct 07 '22 01:10

howaryoo


You can always initialize scripts for your database before running the container that if even in case you want to add multiple users or create tables initially inside of your container. a basic script would be like :

set -e

psql -v ON_ERROR_STOP=1 --username "$POSTGRES_USER" --dbname "$POSTGRES_DB" <<-EOSQL
    CREATE DATABASE database_name;
    CREATE USER new_user_name WITH ENCRYPTED PASSWORD 'new_password';
    GRANT ALL PRIVILEGES ON DATABASE new_user_name TO database_nam;
EOSQL

and can be saved as a shell file (init_db.sh for example). Make sure at last to copy the file from your relative directory to the container by adding it to the docker-compose.yml file :

services:
  db:
    image: postgres:latest
    ports:
      - '4020:5432'
    environment:
    - POSTGRES_USER=postgres
    - POSTGRES_PASSWORD=postgres
    volumes: 
      - ./init_db.sh:/docker-entrypoint-initdb.d/init_db.sh
like image 1
HachemWannes Avatar answered Oct 07 '22 01:10

HachemWannes