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

Che*_*eng 7 postgresql docker docker-for-windows

我想确保即使在Windows主机重启后,我的Postgres数据(使用基于Linux的映像)也能保留。

我尝试遵循以下步骤如何使用卷将数据持久化在dockerized postgres数据库中

docker-compose.yml

volumes:
  - ./postgres_data:/var/lib/postgresql/data
Run Code Online (Sandbox Code Playgroud)

但是,我遇到了错误

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
Run Code Online (Sandbox Code Playgroud)

然后,我尝试按照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
Run Code Online (Sandbox Code Playgroud)

docker-compose.yml

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

volumes:
  postgres_data:
    external: true
Run Code Online (Sandbox Code Playgroud)

但是,我对命令感到困惑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"
    }
]
Run Code Online (Sandbox Code Playgroud)

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

yam*_*ami 0

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

首先要注意的是,postgres 容器内的路径是:

 /var/lib/postgresql/data
Run Code Online (Sandbox Code Playgroud)

现在你试图追踪的路径是另一条路径:

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

/var/lib/docker/volumes/postgres_data/_data
Run Code Online (Sandbox Code Playgroud)

我也在使用Docker for windowsUnix容器。

正如你通常可以检查的那样,你不会看到这个 docker 机器:

docker-machine ls
NAME   ACTIVE   DRIVER   STATE   URL   SWARM   DOCKER   ERRORS
Run Code Online (Sandbox Code Playgroud)

但对于容器来说,有一个访问它的技巧Unix

docker run -it --rm --privileged --pid=host justincormack/nsenter1
Run Code Online (Sandbox Code Playgroud)

只需从 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
Run Code Online (Sandbox Code Playgroud)

因此需要明确的是,它位于Docker for Windows上面目录中提供的虚拟机内部。

Docker for windows需要Hyper-V启用虚拟化。

Docker for windows您还可以在go to Settings->Advanced->中找到图像位置,Disk image location在我的例子中它是:

"C:\ProgramData\DockerDesktop\vm-data\DockerDesktop.vhdx"
Run Code Online (Sandbox Code Playgroud)

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