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