Build postgres docker container with initial schema Build postgres docker container with initial schema postgresql postgresql

Build postgres docker container with initial schema


According to the usage guide for the official PostreSQL Docker image, all you need is:

Dockerfile

FROM postgresENV POSTGRES_DB my_databaseCOPY psql_dump.sql /docker-entrypoint-initdb.d/

The POSTGRES_DB environment variable will instruct the container to create a my_database schema on first run.

And any .sql file found in the /docker-entrypoint-initdb.d/ of the container will be executed.

If you want to execute .sh scripts, you can also provide them in the /docker-entrypoint-initdb.d/ directory.


As said in the comments, @Thomasleveil answer is great and simple if your schema recreation is fast. But in my case it's slow, and I wanted to use docker volumes, so here is what I did

  1. First use docker image as in @Thomasleveil answer to create a container with postgres with all the schema initialization

Dockerfile:

FROM postgresWORKDIR /docker-entrypoint-initdb.dADD psql_dump.sql /docker-entrypoint-initdb.dEXPOSE 5432
  1. then run it and create new local dir which contains the postgres data after its populated from the “psql_dump.sql” file: docker cp mypg:/var/lib/postgresql/data ./postgres-data

  2. Copy the data to a temp data folder, and start a new postgres docker-compose container whose volume is at the new temp data folder:

startPostgres.sh:

rm -r ./temp-postgres-data/datamkdir -p ./temp-postgres-data/datacp -r ./postgres-data/data ./temp-postgres-data/docker-compose -p mini-postgres-project up

and the docker-compose.yml file is:

version: '3'services:  postgres:    container_name: mini-postgres    image: postgres:9.5    ports:    - "5432:5432"    volumes:      - ./temp-postgres-data/data:/var/lib/postgresql/data

Now you can run steps #1 and #2 on a new machine or if your psql_dump.sql changes. And each time you want a new clean (but already initialized) db, you can only run startPostgres.sh from step #3.And it still uses docker volumes.