如何使用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_DB
, POSTGRES_USER
和POSTGRES_PASSWORD
,而不是DB_NAME
, DB_USER
和DB_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)
这几乎是所有这一切。