将Postgres数据挂载到Windows主机目录

时间:2018-02-06 14:54:23

标签: postgresql docker docker-windows

我想确保即使在我的Windows主机重启后,我的Postgres数据(使用基于Linux的图像)仍然存在。

我尝试按照How to persist data in a dockerized postgres database using volumes

步骤进行操作

搬运工-compose.yml

volumes:
  - ./postgres_data:/var/lib/postgresql/data

然而,我收到错误

waiting for server to start....FATAL:  data directory "/var/lib/postgresql/data/pgdata" has wrong ownership
HINT:  The server must be started by the user that owns the data directory.
 stopped waiting
pg_ctl: could not start server

然后,我尝试按照https://forums.docker.com/t/trying-to-get-postgres-to-work-on-persistent-windows-mount-two-issues/12456/5

中的步骤进行操作

建议的方法是

docker volume create --name postgres_data --driver local

搬运工-compose.yml

services:
  postgres:
    volumes:
      - postgres_data:/var/lib/postgresql/data

volumes:
  postgres_data:
    external: true

但是,我对命令docker volume create --name postgres_data --driver local感到困惑。因为,它没有提到Windows主机的确切路径。

我试过

C:\celery-hello-world>docker volume create postgres_data
postgres_data

C:\celery-hello-world>docker volume inspect postgres_data
[
    {
        "CreatedAt": "2018-02-06T14:54:48Z",
        "Driver": "local",
        "Labels": {},
        "Mountpoint": "/var/lib/docker/volumes/postgres_data/_data",
        "Name": "postgres_data",
        "Options": {},
        "Scope": "local"
    }
]

我可以知道Windows目录位置在哪里,VOLUME postgres_data挂载到哪里?

1 个答案:

答案 0 :(得分:0)

今天我在问自己同样的问题,但我已经弄清楚了。

首先要注意的是,在postgres容器中,路径为:

 /var/lib/postgresql/data

现在,您尝试跟踪的路径是另一条路径:

  

C:\ celery-hello-world> docker卷检查postgres_data [       {           “ CreatedAt”:“ 2018-02-06T14:54:48Z”,           “ Driver”:“ local”,           “标签”: {},           “ Mountpoint”:“ / var / lib / docker / volumes / postgres_data / _data”,           “ Name”:“ postgres_data”,           “选项”:{},           “范围”:“本地”       }]

/var/lib/docker/volumes/postgres_data/_data

我也在使用Docker for windowsUnix容器。

正如您可以正常检查的那样,您将不会看到此docker计算机:

docker-machine ls
NAME   ACTIVE   DRIVER   STATE   URL   SWARM   DOCKER   ERRORS

但是有一个关于Unix容器的访问技巧:

docker run -it --rm --privileged --pid=host justincormack/nsenter1
  

只需从您的CLI运行此命令,它将把您放入带有   Moby VM的完整权限。仅适用于Moby Linux VM(无效)   适用于Windows容器)。请注意,这也适用于Mac版Docker。

参考:https://www.bretfisher.com/getting-a-shell-in-the-docker-for-windows-vm/

您可以从那里导航到该文件夹​​(请注意,我将卷命名为postgresql-volume

/var/lib/docker/volumes/postgresql-volume/_data    ls
    PG_VERSION            pg_dynshmem           pg_notify             pg_stat_tmp           postgresql.auto.conf
    base                  pg_hba.conf           pg_replslot           pg_subtrans           postgresql.conf
    global                pg_ident.conf         pg_serial             pg_tblspc             postmaster.opts
    pg_clog               pg_logical            pg_snapshots          pg_twophase           postmaster.pid
    pg_commit_ts          pg_multixact          pg_stat               pg_xlog

因此请注意,它位于以上目录中的Docker for Windows提供的VM内。

Docker for windows需要启用Hyper-V才能进行虚拟化。

您也可以在Docker for windows中找到图片位置,在我的情况下,请转到Settings->Advanced-> Disk image location

"C:\ProgramData\DockerDesktop\vm-data\DockerDesktop.vhdx"

还请注意,在Hyper-V Manager中也可以找到相同的内容。