Primero, esas variables de entorno parecen sospechosas. Eche un vistazo a la documentación de la imagen oficial de Docker
y tenga en cuenta que necesita POSTGRES_DB
, POSTGRES_USER
y POSTGRES_PASSWORD
, en lugar de DB_NAME
, DB_USER
y DB_PASS
.
Aparte de eso, pareces estar mayormente en el camino correcto. He aquí un ejemplo completo:
Primero, inicio un contenedor de Postgres. Estoy ubicando el almacenamiento persistente en algún lugar fuera de mi directorio de inicio porque, como ya ha notado, los archivos no serán de su propiedad, lo que puede ser confuso en su directorio de inicio (aunque no necesariamente problemático):
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
Dado que esta es la primera vez que comencé postgres apuntando a ese directorio de datos, lo veremos inicializar la base de datos:
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:
Ahora, desde otra ventana, puedo conectarme...
$ 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.
...y crea algunos datos:
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)
Ahora, salgo del contenedor:
^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
Podemos verificar que ya no se está ejecutando:
$ docker ps | grep postgres
Pero si lo volvemos a iniciar con los mismos argumentos de la línea de comandos;
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
Vemos que no inicializa la base de datos, ya que ya existe, y saltamos directamente a:
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
En este punto, podemos volver a conectarnos a la base de datos y encontrar que nuestros datos aún existen:
$ 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)
Eso es prácticamente todo lo que hay que hacer.