2016-10-21 11 views
5

Próbuję ustawić, aby moje dane pozostały w/home/me/redmine, tak aby po zatrzymaniu się mojego kontenera nie było utraty danych. Używam oficjalnego obrazu hubu dockera PostgreSQL.Jak utrwalić dane za pomocą obrazu dokowanego postgres?

Problem polega na tym, że za każdym razem, gdy uruchamiam kontener Postgres, natychmiast wychodzi. Ten problem zaczął się, gdy dołączałem "dane" do/var/lib/postgresql, w przeciwnym razie, bez dodawania "danych", zaczyna się, ale moje dane nie są zapisywane. Ścieżka, którą mam na komputerze hosta, to /var/lib/postgresql/9.4/data, ale strona z obrazem mówi o używaniu/var/lib/postgresql/data.

Oto jak próbuję uruchomić/zainstalować wolumin z hosta:

docker run --name postgres -d \ 
    --env='DB_NAME=redmine_production' \ 
    --env='DB_USER=redmine' \ 
    --env='DB_PASS=secret' \ 
    --volume=/home/me/redmine/postgresql:/var/lib/postgresql/data \ 
    postgres 

... a potem po Chciałbym połączyć Redmine następująco ...

docker run -d -p 3000:3000 --name redmine \ 
    -v /home/me/redmine/files:/usr/src/redmine/files \ 
    --link postgres:postgres redmine 

W kontener redmine, wolumin/home/me/redmine/files jest osobnym katalogiem, w którym próbuję przechowywać pliki poza tymi w bazie danych Postgres.

Edit:

kiedy cd do mojego maszyn host/var lib// PostgreSQL, znajdę, bo w 9.4/danych, a następnie zobaczyć, że właściciel i grupa nie są wymienione w moim/etc/passwd lub/etc/groups i zastanawiam się, czy to nie ma nic wspólnego z problemem.

/var/lib/postgresql/9.4/data # ls -la 
total 88 
drwx------ 18 70 70 4096 Aug 13 2015 . 
drwxr-xr-x 3 root root 4096 Mar 28 2015 .. 
drwx------ 8 70 70 4096 Jul 2 2015 base 
drwx------ 2 70 70 4096 Jul 2 2015 global 
drwx------ 2 70 70 4096 Mar 28 2015 pg_clog 
drwx------ 2 70 70 4096 Mar 28 2015 pg_dynshmem 
lrwxrwxrwx 1 root root 31 Mar 28 2015 pg_hba.conf -> /etc/postgresql- 9.4/pg_hba.conf 
lrwxrwxrwx 1 root root 33 Mar 28 2015 pg_ident.conf -> /etc/postgresql-9.4/pg_ident.conf 
drwx------ 4 70 70 4096 Mar 28 2015 pg_logical 
drwx------ 4 70 70 4096 Mar 28 2015 pg_multixact 
drwx------ 2 70 70 4096 Jul 2 2015 pg_notify 
drwx------ 2 70 70 4096 Mar 28 2015 pg_replslot 
drwx------ 2 70 70 4096 Mar 28 2015 pg_serial 
drwx------ 2 70 70 4096 Mar 28 2015 pg_snapshots 
drwx------ 2 70 70 4096 Aug 13 2015 pg_stat 
drwx------ 2 70 70 4096 Aug 13 2015 pg_stat_tmp 
drwx------ 2 70 70 4096 Mar 28 2015 pg_subtrans 
drwx------ 2 70 70 4096 Mar 28 2015 pg_tblspc 
drwx------ 2 70 70 4096 Mar 28 2015 pg_twophase 
-rw------- 1 70 70 4 Mar 28 2015 PG_VERSION 
drwx------ 3 70 70 4096 Mar 28 2015 pg_xlog 
-rw------- 1 70 70 88 Mar 28 2015 postgresql.auto.conf 
lrwxrwxrwx 1 root root 35 Mar 28 2015 postgresql.conf -> /etc/postgresql-9.4/postgresql.conf 
-rw------- 1 70 70 1626 Aug 13 2015 postmaster.log 
-rw------- 1 70 70 114 Jul 2 2015 postmaster.opts 

Myśli?

Odpowiedz

13

Po pierwsze, te zmienne środowiskowe wyglądają podejrzanie. Spójrz na numer documentation for the official Docker image i zauważ, że potrzebujesz POSTGRES_DB, POSTGRES_USER i POSTGRES_PASSWORD, zamiast DB_NAME, i DB_PASS.

Poza tym wydaje się, że jesteś na dobrej drodze. Oto pełny przykład:

Najpierw uruchamiam kontener Postgres. Lokalizuję trwałe miejsce gdzieś poza moim katalogiem domowym, ponieważ, jak już zauważyłeś, pliki nie będą własnością ciebie, co może być mylące w twoim katalogu domowym (ale niekoniecznie problematycznym):

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 

Ponieważ jest to pierwszy raz zacząłem postgres wskazując przy tym katalogu danych, ujrzymy go zainicjować bazy danych:

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: 

teraz z innego okna, mogę się z nią połączyć ...

$ 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. 

...i stworzyć pewne dane:

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) 

Teraz mogę wyjść z pojemnika:

^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 

Możemy sprawdzić, że to już nie działa:

$ docker ps | grep postgres 

Ale jeśli uruchomić go ponownie te same argumenty wiersza poleceń;

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 

Widzimy, że nie inicjuje bazy danych, ponieważ już istnieje, i przejdź bezpośrednio do:

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 

W tym momencie, możemy ponownie połączyć się z bazą danych i okaże się, że nasze dane nadal istnieją:

$ 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 wszystko, co do niego należy.

Powiązane problemy