Che*_*eng 7 postgresql docker docker-for-windows
我想确保即使在Windows主机重启后,我的Postgres数据(使用基于Linux的映像)也能保留。
我尝试遵循以下步骤如何使用卷将数据持久化在dockerized postgres数据库中
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)
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
挂载到该目录?
今天我问自己同样的问题,但我已经弄清楚了。
首先要注意的是,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 windows
和Unix
容器。
正如你通常可以检查的那样,你不会看到这个 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
。
归档时间: |
|
查看次数: |
1440 次 |
最近记录: |