如何使用 postgres docker 图像保存数据?
How to persist data using postgres docker image?
我正在尝试让我的数据持久保存在 /home/me/redmine 中,这样当我的容器停止时,就不会丢失数据。我正在使用官方 postgres docker 中心图像。
问题是,每次我启动 postgres 容器时,它都会立即退出。当我将 'data' 附加到 /var/lib/postgresql 时,这个问题就开始了,否则,如果不添加 'data',它就会开始,但我的数据没有被保存。另外,我在我的主机上的路径是 /var/lib/postgresql/9.4/data,但是图像页面说使用 /var/lib/postgresql/data.
以下是我尝试从主机 start/mount 卷的方式:
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
... 然后我 link 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 数据库中的文件。
编辑:
当我 cd 进入我的主机 /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:
现在,我可以从另一个 window 连接到它...
$ 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)
这就是它的全部内容。
我正在尝试让我的数据持久保存在 /home/me/redmine 中,这样当我的容器停止时,就不会丢失数据。我正在使用官方 postgres docker 中心图像。
问题是,每次我启动 postgres 容器时,它都会立即退出。当我将 'data' 附加到 /var/lib/postgresql 时,这个问题就开始了,否则,如果不添加 'data',它就会开始,但我的数据没有被保存。另外,我在我的主机上的路径是 /var/lib/postgresql/9.4/data,但是图像页面说使用 /var/lib/postgresql/data.
以下是我尝试从主机 start/mount 卷的方式:
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
... 然后我 link 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 数据库中的文件。
编辑:
当我 cd 进入我的主机 /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:
现在,我可以从另一个 window 连接到它...
$ 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)
这就是它的全部内容。