Как сохранить данные с помощью postgres docker image?

#postgresql #docker #redmine

#postgresql #docker #redmine

Вопрос:

Я пытаюсь сохранить свои данные в / home / me / redmine, чтобы при остановке моего контейнера потери данных не было. Я использую официальный образ postgres docker hub.

Проблема в том, что каждый раз, когда я запускаю контейнер postgres, он немедленно завершается. Эта проблема началась, когда я добавил ‘data’ в /var / lib / postgresql, в противном случае, без добавления ‘data’, он запускается, но мои данные не сохраняются. Кроме того, путь, который у меня есть на моем хост-компьютере, — это /var/ lib / postgresql / 9.4 /data, но на странице изображения указано использовать /var/ lib / postgresql /data.

Вот как я пытаюсь запустить / смонтировать том с хоста:

 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
  

… и затем , после того как я свяжу redmine следующим образом …

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

В контейнере redmine том /home / me / redmine /files представляет собой отдельный каталог, в котором я пытаюсь сохранить файлы, отличные от тех, что находятся в базе данных Postgres.

Редактировать:

Когда я захожу на компакт-диск в каталог своих хост-компьютеров / var / lib / postgresql, я нахожу в нем 9.4 /data, а затем вижу, что владельца и группы нет в моих /etc / passwd или / etc / groups, и задаюсь вопросом, не связано ли это как-то с проблемой.

 /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
  

Мысли?

Ответ №1:

Во-первых, эти переменные среды выглядят подозрительно. Взгляните на документацию к официальному образу Docker и обратите внимание, что вам нужны POSTGRES_DB , POSTGRES_USER и POSTGRES_PASSWORD , а не DB_NAME , DB_USER и DB_PASS .

В остальном, вы, кажется, в основном находитесь на правильном пути. Вот полный пример:

Сначала я запускаю контейнер Postgres. Я размещаю постоянное хранилище где-то за пределами моего домашнего каталога, потому что, как вы уже отметили, файлы не будут принадлежать вам, что может привести к путанице в вашем домашнем каталоге (хотя и не обязательно проблематично):

 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
  

Поскольку я впервые запускаю postgres, указывающий на этот каталог данных, мы увидим, как он инициализирует базу данных:

 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:
  

Теперь, из другого окна, я могу подключиться к нему…

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

…и создайте некоторые данные:

 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)
  

Теперь я выхожу из контейнера:

 ^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
  

Мы можем убедиться, что он больше не работает:

 $ docker ps | grep postgres
  

Но если мы запустим его снова с теми же аргументами командной строки;

 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
  

Мы видим, что он не инициализирует базу данных, поскольку она уже существует, и сразу переходим к:

 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
  

На этом этапе мы можем повторно подключиться к базе данных и обнаружить, что наши данные все еще существуют:

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

Вот, пожалуй, и все, что в ней есть.

Комментарии:

1. Я бы добавил, что после перезапуска системы, в которой находятся контейнер и том, данные теряются или больше не доступны контейнеру и базе данных. Это может быть ошибкой с моей стороны, но я пока не могу найти что-либо для ее решения. Однако это решение работает действительно хорошо и было очень полезно для живой системы.

2. Мне удалось устранить проблему, используя папку в моей домашней папке (или на рабочем столе), хотя это и не так практично, как решение, предлагаемое larsks, но оно помогло с моей конкретной проблемой или сохранением при перезагрузке системы.