如何从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正确映射文件夹?
答案 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引擎应解决它。