2016-10-21 51 views
5

我試圖讓我的數據堅持在/ home/me/redmine中,以便當我的容器停止時,不會丟失數據。我正在使用官方的postgres docker hub鏡像。如何使用postgres docker鏡像保存數據?

問題是,每次啓動postgres容器時,它立即退出。當我將數據添加到/ var/lib/postgresql時,這個問題就開始了,否則,在不添加數據的情況下,它會啓動,但我的數據不會被保存。另外,我在主機上的路徑是/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 

...然後在我將連接管理平臺如下...

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 /數據中,然後看到所有者和組沒有在我的/ 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 

想法?

回答

13

首先,這些環境變量看起來很可疑。看看documentation for the official Docker image,並注意您需要POSTGRES_DB,POSTGRES_USERPOSTGRES_PASSWORD,而不是DB_NAME,DB_USERDB_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 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) 

這幾乎都是它的一切。