簡體   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