简体   繁体   English

如何使用postgres docker镜像保留数据?

[英]How to persist data using postgres docker image?

I'm trying to get my data to persist in /home/me/redmine so that when my container stops, no data loss. 我正在尝试将我的数据保存在/ home / me / redmine中,这样当我的容器停止时,没有数据丢失。 I'm using the official postgres docker hub image. 我正在使用官方的postgres docker hub图像。

Problem is, every time I start the postgres container, it immediately exits. 问题是,每次我启动postgres容器时,它会立即退出。 This problem started when I appended 'data' to /var/lib/postgresql, otherwise, without adding 'data', it starts, but my data isn't being saved. 当我将'data'附加到/ var / lib / postgresql时,这个问题就开始了,否则,在没有添加'data'的情况下,它会启动,但是我的数据没有被保存。 Also, the path I have on my host machine is /var/lib/postgresql/9.4/data, but the image page says to use /var/lib/postgresql/data. 此外,我在主机上的路径是/var/lib/postgresql/9.4/data,但图像页面说使用/ var / lib / postgresql / data。

Here's how I'm trying to start/mount a volume from the host: 以下是我尝试从主机启动/挂载卷的方法:

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

... and then after I would link redmine as follows ... ...然后我将redmine链接如下......

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

In the redmine container, the /home/me/redmine/files volume is a seperate directory where I'm trying to persist files aside from the ones in the Postgres database. 在redmine容器中,/ home / me / redmine / files卷是一个单独的目录,我试图将文件保留在Postgres数据库中的文件之外。

Edit: 编辑:

When I cd into my host machines /var/lib/postgresql directory, I find within it 9.4/data and then see that the owner and group are not listed in my /etc/passwd or /etc/groups and wonder if this doesn't have something to do with the problem. 当我进入我的主机/ 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

Thoughts? 思考?

First, those environment variables look suspicious. 首先,这些环境变量看起来很可疑。 Take a look at the documentation for the official Docker image , and note that you need POSTGRES_DB , POSTGRES_USER , and POSTGRES_PASSWORD , rather than DB_NAME , DB_USER , and DB_PASS . 查看官方Docker镜像文档 ,并注意您需要POSTGRES_DBPOSTGRES_USERPOSTGRES_PASSWORD ,而不是DB_NAMEDB_USERDB_PASS

Other than that, you seem to mostly be on the right track. 除此之外,你似乎大多数都在正确的轨道上。 Here's a complete example: 这是一个完整的例子:

First, I start a Postgres container. 首先,我启动一个Postgres容器。 I'm locating the persistent storage somewhere outside of my home directory, because as you have already noted that files won't be owned by you, which can be confusing in your home directory (though not necessarily problematic): 我在我的主目录之外的某个地方找到持久性存储,因为您已经注意到文件将不归您所有,这可能会在您的主目录中混淆(尽管不一定有问题):

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

Since this is the first time I've started postgres pointing at that data directory, we will see it initialize the database: 由于这是我第一次开始指向该数据目录的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:

Now, from another window, I can connect to it... 现在,从另一个窗口,我可以连接到它...

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

...and create some data: ...并创建一些数据:

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)

Now, I exit the container: 现在,我退出容器:

^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

We can verify that it's no longer running: 我们可以验证它已不再运行:

$ docker ps | grep postgres

But if we start it up again with the same command line arguments; 但是如果我们用相同的命令行参数再次启动它;

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

We see that it doesn't initialize the database, since it already exists, and skip straight to: 我们看到它没有初始化数据库,因为它已经存在,并直接跳到:

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

At this point, we can re-connect to the database and find that our data still exists: 此时,我们可以重新连接到数据库并发现我们的数据仍然存在:

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

That's pretty much all there is to it. 这就是它的全部内容。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM