如何在docker容器中保留初始db

时间:2016-06-19 22:30:38

标签: docker persistence

如何从docker postgres:9.6容器中外部化数据库?没有泊坞窗音量的容器启动很好。使用映射到主机文件夹的docker卷启动容器会删除数据库和配置。据我所知,这是正确的docker volumee行为,主机文件夹安装在容器文件夹的顶部。 如何解决此问题并将在容器上创建的数据库启动到我的主机文件夹,以便在容器下次启动时可用?

不确定我在这里做错了什么。

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

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

root@fe0e5751c98d:/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@localhost postgres]$ ls -al
total 1
drwxrwxrwx. 1 vagrant vagrant 0 Jun 20 12:27 .
drwxrwxrwx. 1 vagrant vagrant 0 Jun 18 09:33 ..
-rwxrwxrwx. 1 vagrant vagrant 5 Jun 19 21:47 container.txt
drwxrwxrwx. 1 vagrant vagrant 0 Jun 20 12:27 data
-rwxrwxrwx. 1 vagrant vagrant 0 Jun 20 12:24 dockerhost.txt
[vagrant@localhost postgres]$ ls -al data
total 0
drwxrwxrwx. 1 vagrant vagrant 0 Jun 20 12:27 .
drwxrwxrwx. 1 vagrant vagrant 0 Jun 20 12:27 ..

但是,如果我映射到Vagrant未映射的文件夹(我在Windows上)我不会丢失数据。所以似乎Docker将文件夹映射到Vagrant映射文件夹之间可能存在问题。在Docker主机上postgres容器创建的目录(当没有映射到Vagrant共享文件夹时)具有奇怪的权限(所有者和基)。

[vagrant@localhost ~]$ 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
[vagrant@localhost ~]$ 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
[vagrant@localhost ~]$ 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
[vagrant@localhost ~]$ ls -al workspace/postgres/data
ls: cannot open directory workspace/postgres/data: Permission denied
[vagrant@localhost ~]$ sudo ls -al workspace/postgres/data

postgres数据目录已由systemd-bus-proxy创建。容器创建文件夹的组和所有者是否可以阻止Docker或Vagrant正确映射文件夹?

1 个答案:

答案 0 :(得分: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

编辑:从您添加的内容中,我看到您正在使用Docker上的主机卷,该主机卷在Vagrant VM中运行并将该卷映射到随后映射到Windows主机的共享。查看this github thread这是一个相当常见的旧问题,这是由于在VM映射共享文件系统之前启动了docker引擎。重新启动VM内的docker引擎应解决它。