web-dev-qa-db-ja.com

postgres dockerイメージを使用してデータを永続化する方法は?

コンテナが停止したときにデータが失われないように、データを/ home/me/redmineに保持しようとしています。公式のpostgresdockerハブイメージを使用しています。

問題は、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ディレクトリにcdすると、その中に9.4/dataがあり、所有者とグループが/ etc/passwdまたは/ etc/groupsにリストされていないことがわかり、これがリストされていないかどうか疑問に思います。 tは問題と関係があります。

/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

考え?

9
Ender

まず、これらの環境変数は疑わしいように見えます。 公式のDockerイメージのドキュメント を見て、POSTGRES_DBではなくPOSTGRES_USERPOSTGRES_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)

それがほとんどすべてです。

20
larsks