Premièrement, ces variables d'environnement semblent suspectes. Jetez un œil à la documentation pour l'image Docker officielle
, et notez que vous avez besoin de POSTGRES_DB
, POSTGRES_USER
, et POSTGRES_PASSWORD
, plutôt que DB_NAME
, DB_USER
, et DB_PASS
.
En dehors de cela, vous semblez généralement être sur la bonne voie. Voici un exemple complet :
Tout d'abord, je démarre un conteneur Postgres. Je localise le stockage persistant quelque part en dehors de mon répertoire personnel, car comme vous l'avez déjà noté, les fichiers ne vous appartiendront pas, ce qui peut prêter à confusion dans votre répertoire personnel (mais pas nécessairement problématique) :
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
Comme c'est la première fois que je lance postgres pointant vers ce répertoire de données, nous allons le voir initialiser la base de données :
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:
Maintenant, depuis une autre fenêtre, je peux m'y connecter...
$ 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.
...et créez des données :
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)
Maintenant, je sors du conteneur :
^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
Nous pouvons vérifier qu'il ne fonctionne plus :
$ docker ps | grep postgres
Mais si nous le redémarrons avec les mêmes arguments de ligne de commande ;
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
On voit qu'il n'initialise pas la base de données, puisqu'elle existe déjà, et on passe directement à :
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
À ce stade, nous pouvons nous reconnecter à la base de données et constater que nos données existent toujours :
$ 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)
C'est à peu près tout ce qu'il y a à faire.