PostgreSQL
 sql >> Baza danych >  >> RDS >> PostgreSQL

Jak zachować dane za pomocą obrazu dokera postgres?

Po pierwsze, te zmienne środowiskowe wyglądają podejrzanie. Zapoznaj się z dokumentacją oficjalnego obrazu Dockera i pamiętaj, że potrzebujesz POSTGRES_DB , POSTGRES_USER i POSTGRES_PASSWORD , a nie DB_NAME , DB_USER i DB_PASS .

Poza tym wydaje się, że w większości jesteś na dobrej drodze. Oto kompletny przykład:

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

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ż po raz pierwszy zacząłem postgres wskazujący na ten katalog danych, zobaczymy, że inicjuje bazę 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 mogę się z nim połączyć z innego 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.

...i utwórz trochę danych:

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 wychodzę z kontenera:

^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ć, czy już nie działa:

$ docker ps | grep postgres

Ale jeśli uruchomimy go ponownie z tymi samymi argumentami 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ź od razu 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 stwierdzić, ż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 prawie wszystko.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Jak utworzyć postgres do Oracle dblink?

  2. Uruchom, aby zaktualizować bieżącą datę w Postgres 9

  3. Hibernuj powoli, aby uzyskać połączenie Postgres

  4. Ruby Datamapper .count zawsze zwraca 0

  5. Postgres niewrażliwy na akcentowanie wyszukiwania LIKE w Rails 3.1 na Heroku