I\'m trying to get my data to persist in /home/me/redmine so that when my container stops, no data loss. I\'m using the official postgres docker hub image.
Problem is, e
First, those 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
.
Other than that, you seem to mostly be on the right track. Here's a complete example:
First, I start a Postgres container. I'm locating the persistent storage somewhere outside of my home directory, because as you have already noted that files won't be owned by you, which can be confusing in your home directory (though 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've started postgres pointing at that data directory, we will see it initialize 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=# create table testtable (id integer);
CREATE TABLE
larstest=# insert into testtable values (1);
INSERT 0 1
larstest=# select * from testtable;
id
----
1
(1 row)
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's no longer running:
$ docker ps | grep postgres
But if we start it up 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 doesn't initialize the database, since it already exists, and skip straight to:
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 re-connect 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=# select * from testtable;
id
----
1
(1 row)
That's pretty much all there is to it.