Firstly, these environment variables look suspicious. Take a look at the documentation for the official Docker image and note that you need POSTGRES_DB , POSTGRES_USER and POSTGRES_PASSWORD , rather than DB_NAME , DB_USER and DB_PASS .
Also, you seem to be mostly on the right track. Here is a complete example:
First I launch the Postgres container. I host persistent storage somewhere outside of my home directory because, as you already noted, the files will not belong to you, which can be confusing in your home directory (although not necessarily problematic):
docker run --rm --name postgres \ -v /tmp/postgres:/var/lib/postgresql/data \ -e POSTGRES_DB=larstest \ -e POSTGRES_USER=lars \ -e POSTGRES_PASSWORD=secret postgres
Since this is the first time I started postgres pointing to this data directory, we will see that it initializes the database:
The database cluster will be initialized with locale "en_US.utf8". The default database encoding has accordingly been set to "UTF8". The default text search configuration will be set to "english". Data page checksums are disabled. fixing permissions on existing directory /var/lib/postgresql/data ... ok creating subdirectories ... ok selecting default max_connections ... 100 selecting default shared_buffers ... 128MB selecting dynamic shared memory implementation ... posix creating configuration files ... ok running bootstrap script ... ok performing post-bootstrap initialization ... ok syncing data to disk ... ok Success. You can now start the database server using:
Now, from another window, I can connect to it ...
$ psql -h 172.17.0.4 -U lars larstest Password for user lars: psql (9.5.4, server 9.6.0) WARNING: psql major version 9.5, server major version 9.6. Some psql features might not work. Type "help" for help.
... and create some data:
larstest=
Now I exit the container:
^CLOG: received fast shutdown request LOG: aborting any active transactions FATAL: terminating connection due to administrator command LOG: autovacuum launcher shutting down LOG: shutting down LOG: database system is shut down
We can verify that it no longer works:
$ docker ps | grep postgres
But if we run it again with the same command line arguments,
docker run --rm --name postgres \ -v /tmp/postgres:/var/lib/postgresql/data \ -e POSTGRES_DB=larstest \ -e POSTGRES_USER=lars \ -e POSTGRES_PASSWORD=secret postgres
We see that it does not initialize the database because it already exists, and skip directly:
LOG: database system was shut down at 2016-10-21 03:13:50 UTC LOG: MultiXact member wraparound protections are now enabled LOG: database system is ready to accept connections LOG: autovacuum launcher started
At this point, we can reconnect to the database and find that our data still exists:
$ psql -h 172.17.0.2 -U lars larstest Password for user lars: psql (9.5.4, server 9.6.0) WARNING: psql major version 9.5, server major version 9.6. Some psql features might not work. Type "help" for help. larstest=
That is almost all there is.