2016-06-19 42 views
0

如何从docker postgres:9.6容器中对数据库进行外部化?在没有码头容器的情况下启动容器很好。使用映射到主机文件夹的docker卷启动容器将清除数据库和配置。我知道这是正确的docker volumee行为,主机文件夹安装在容器文件夹的顶部。 如何解决此问题并将在容器上创建的数据库映射到我的主机文件夹,以便容器下一次启动时可用?如何在Docker容器中保存初始数据块

不知道我在做什么错在这里。

docker run --name test-postgres \ 
-e POSTGRES_PASSWORD=test123 \ 
-v /home/vagrant/workspace/shared-data/postgres:/var/lib/postgresql \ 
-d postgres:9.6 

这将旋转容器并按预期创建数据库。容器结果:

[email protected]:/var/lib/postgresql# ls -al data 
total 0 
drwxr-xr-x. 2 root  root  6 Jun 20 12:32 . 
drwxr-xr-x. 3 postgres postgres 17 Jun 20 12:32 ..   

主机上的映射驱动器创建了数据文件夹,但它是空的!但是,如果我映射到未被Vagrant映射的文件夹(我在Windows上),我不会丢失数据。所以Docker映射文件夹到Vagrant映射文件夹似乎可能存在问题。指出docker主机上由postgres容器创建的目录(当未映射到Vagrant共享文件夹时)具有奇怪的权限(所有者和组)。

[[email protected] ~]$ ls -al 
total 20 
drwx------. 4 vagrant vagrant 4096 Jun 23 17:51 . 
drwxr-xr-x. 3 root root  20 May 21 20:07 .. 
-rw-r--r--. 1 vagrant vagrant 18 Nov 20 2015 .bash_logout 
-rw-r--r--. 1 vagrant vagrant 193 Nov 20 2015 .bash_profile 
-rw-r--r--. 1 vagrant vagrant 231 Nov 20 2015 .bashrc 
drwx------. 2 vagrant root  28 Jun 23 17:47 .ssh 
-rw-r--r--. 1 vagrant vagrant 6 May 21 13:07 .vbox_version 
drwxr-xr-x. 4 vagrant vagrant 39 Jun 23 18:01 workspace 
[[email protected] ~]$ ls -al workspace/ 
total 4 
drwxr-xr-x. 4 vagrant vagrant 39 Jun 23 18:01 . 
drwx------. 4 vagrant vagrant 4096 Jun 23 17:51 .. 
drwxr-xr-x. 3 root root  17 Jun 23 18:01 postgres 
drwxr-xr-x. 5 vagrant vagrant 46 Jun 23 17:51 shared-data 
[[email protected] ~]$ ls -al workspace/postgres/ 
total 4 
drwxr-xr-x. 3 root    root  17 Jun 23 18:01 . 
drwxr-xr-x. 4 vagrant   vagrant 39 Jun 23 18:01 .. 
drwx------. 19 systemd-bus-proxy root 4096 Jun 23 18:01 data 
[[email protected] ~]$ ls -al workspace/postgres/data 
ls: cannot open directory workspace/postgres/data: Permission denied 
[[email protected] ~]$ sudo ls -al workspace/postgres/data 

Postgres的数据目录已经由systemd总线代理创建。容器组和容器创建文件夹的所有者是否可以阻止Docker或Vagrant正确映射文件夹?

+0

在你的流浪实例中运行一个'id 999',它可能会返回systemd-bus-proxy用户。这是主机映射卷和uid的问题,它们通常属于主机vs容器内的不同用户。一个命名卷隐藏了这个问题。 – BMitch

回答

0

这种形象初始化数据没有问题,对我来说,只要确保你安装卷是由容器可写:

$ mkdir data 
$ ls -al data/ 
total 8 
drwxr-xr-x 2 bmitch bmitch 4096 Jun 19 19:30 . 
drwxr-xr-x 3 bmitch bmitch 4096 Jun 19 19:30 .. 
$ chmod 777 data 
$ docker run --name test-postgres \ 
    -e POSTGRES_PASSWORD=test123 \ 
    -v `pwd`/data:/var/lib/postgresql/data \ 
    -d postgres:9.6 
$ sudo ls -al data 
[sudo] password for bmitch: 
total 128 
drwx------ 19 999 bmitch 4096 Jun 19 19:32 . 
drwxr-xr-x 3 bmitch bmitch 4096 Jun 19 19:30 .. 
drwx------ 5 999 docker 4096 Jun 19 19:32 base 
drwx------ 2 999 docker 4096 Jun 19 19:33 global 
... 

注意UID 999是内部的容器。一个名为卷避免了UID映射和chmod到世界可写的部分:

$ docker run --name test-postgres \ 
    -e POSTGRES_PASSWORD=test123 \ 
    -v postgres-data:/var/lib/postgresql/data \ 
    -d postgres:9.6 

编辑:从你的补充,我看你正在使用的是一个流浪VM和映射内部运行上泊坞窗主机体积体积映射到Windows主机。查看this github thread在VM映射共享文件系统之前,由docker引擎启动导致了一个相当普遍且较老的问题。重新启动虚拟机内的docker引擎应该解决它。

+0

逻辑上。 Docker卷如何映射回主机一定是个问题。 – AgentCormac

+0

使用相同的空文件夹结果升级到最新版本。所以我通过启动码头主机,重新启动码头主机上的码头服务,然后创建我的容器,尝试了你的建议........................仍然结束与一个空的容器。 – AgentCormac