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

我正在尝试将我的数据保存在/ home / me / redmine中,这样当我的容器停止时,没有数据丢失.我正在使用官方的postgres docker hub图像.

问题是,每次我启动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目录时,我在其中找到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

思考?

最佳答案
首先,这些环境变量看起来很可疑.看一下documentation for the official Docker image,注意你需要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 major version 9.6.
         Some psql features might not work.
Type "help" for help.

larstest=# select * from testtable;
 id 
----
  1
(1 row)

这就是它的全部内容.

相关文章

文章浏览阅读8.8k次,点赞2次,收藏7次。本文介绍Docker Com...
文章浏览阅读1.5w次,点赞7次,收藏76次。原网提供的教程需要...
文章浏览阅读940次,点赞20次,收藏20次。通过 docker run 命...
文章浏览阅读1k次,点赞20次,收藏20次。Podman 是一个开源的...
文章浏览阅读2.1k次。请注意,这些命令需要在 Docker 主机上...
文章浏览阅读1.1k次,点赞37次,收藏40次。nacos搭建集群连接...