繁体   English   中英

如何将初始数据库持久保存在Docker容器中

[英]How to persist initial db in a docker container

如何从docker postgres:9.6容器中外部化数据库? 在没有docker卷的情况下启动容器就可以了。 使用映射到主机文件夹的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映射的文件夹之间可能存在问题。组)。

[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正确映射吗?

该映像对我来说初始化数据没有问题,只需确保您安装的卷可被容器写入:

$ 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主机。 看着这个github线程,有一个相当普遍和古老的问题,是由Docker引擎在VM映射共享文件系统之前启动而引起的。 在虚拟机内部重新启动docker引擎应该可以解决它。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM