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

我试图让我的数据坚持在/ home / me / redmine,以便当我的容器停止时,没有数据丢失。 我正在使用官方的postgres docker hub镜像。

问题是,每次我启动postgres容器,它立即退出。 当我向/ var / lib / postgresql添加'data'时,这个问题就开始了,否则,在没有添加'data'的情况下,它会启动,但是我的数据没有被保存。 另外,我在主机上的path是/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目录时,我在其中find了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 

思考?

首先,这些环境variables看起来很可疑。 查看官方Docker镜像的文档 ,注意你需要POSTGRES_DBPOSTGRES_USERPOSTGRES_PASSWORD ,而不是DB_NAMEDB_USERDB_PASS

除此之外,你似乎主要是在正确的轨道上。 这是一个完整的例子:

首先,我开始一个Postgres容器。 我正在查找永久存储在我的主目录以外的地方,因为你已经注意到文件不会被你所拥有,这可能会在你的主目录中引起混淆(尽pipe不一定有问题):

 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. 

…并创build一些数据:

 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 

我们可以validation它不再运行:

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

这几乎是所有这一切。