Как сохранить данные с помощью postgres docker image?
Я пытаюсь сохранить мои данные в /home / me / redmine, чтобы при остановке контейнера не было потери данных. Я использую официальный образ центра докеров postgres.
Проблема в том, что каждый раз, когда я запускаю контейнер 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
... а после я бы связал редмайна следующим образом ...
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.
Правка:
Когда я вхожу в каталог host machines /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)