【问题标题】:How to persist data using postgres docker image?如何使用 postgres docker image 持久化数据?
【发布时间】:2016-10-21 02:05:18
【问题描述】:

我正在尝试让我的数据保留在 /home/me/redmine 中,以便当我的容器停止时,不会丢失数据。我使用的是官方的 postgres docker hub 镜像。

问题是,每次我启动 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

...然后我将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

想法?

【问题讨论】:

    标签: postgresql docker redmine


    【解决方案1】:

    首先,这些环境变量看起来很可疑。看看documentation for the official Docker image,注意你需要POSTGRES_DBPOSTGRES_USERPOSTGRES_PASSWORD,而不是DB_NAMEDB_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)
    

    这就是它的全部内容。

    【讨论】:

    • 我要补充一点,一旦容器和卷所在的系统重新启动,数据就会丢失或容器和数据库无法再访问。这可能是我这边的一个错误,但到目前为止我找不到解决它的方法。但是,此解决方案效果非常好,并且对于实时系统非常有用。
    • 我设法通过使用我的主文件夹(或桌面)上的文件夹解决了这个问题,虽然不如 larsks 提供的解决方案实用,但它解决了我的特定问题或重新启动时的持久性系统。
    猜你喜欢
    • 2019-09-15
    • 2019-06-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多