Za prvé, tyto proměnné prostředí vypadají podezřele. Podívejte se na dokumentaci k oficiálnímu obrázku Docker
a všimněte si, že potřebujete POSTGRES_DB
, POSTGRES_USER
a POSTGRES_PASSWORD
, spíše než DB_NAME
, DB_USER
a DB_PASS
.
Kromě toho se zdá, že jste většinou na správné cestě. Zde je úplný příklad:
Nejprve spustím kontejner Postgres. Trvalé úložiště nacházím někde mimo svůj domovský adresář, protože jak jste již poznamenali, soubory nebudete vlastnit, což může být ve vašem domovském adresáři matoucí (i když to nemusí být nutně problematické):
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
Protože je to poprvé, co jsem začal postgres ukazovat na tento datový adresář, uvidíme, jak inicializuje databázi:
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:
Nyní se k němu mohu připojit z jiného okna...
$ 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.
...a vytvořte nějaká 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)
Nyní opustím kontejner:
^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
Můžeme ověřit, že již neběží:
$ docker ps | grep postgres
Ale pokud jej znovu spustíme se stejnými argumenty příkazového řádku;
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
Vidíme, že neinicializuje databázi, protože již existuje, a přeskočte rovnou na:
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
V tomto okamžiku se můžeme znovu připojit k databázi a zjistit, že naše data stále existují:
$ 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)
To je v podstatě vše.