当前位置: 首页 > 知识库问答 >
问题:

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

唐元青
2023-03-14

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

我尝试按照以下步骤操作如何使用卷将数据持久化到dockerize postgres数据库中

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
services:
  postgres:
    volumes:
      - postgres_data:/var/lib/postgresql/data

volumes:
  postgres_data:
    external: true

但是,我对docker卷create--namepostgres_data--drivelocal命令感到困惑。因为,它没有提到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目录的位置在哪里吗?postgres\u数据装载到哪个卷?

共有1个答案

郑波
2023-03-14

今天我问自己同样的问题,但我已经想通了。

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

 /var/lib/postgresql/data

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

C: \芹菜你好世界

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

我也在使用Docker for windows和Unix容器。

您可以正常检查,您不会看到此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完全权限的容器中。仅适用于MobyLinuxVM(不适用于Windows容器)。请注意,这也适用于Docker for Mac。

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

您可以从那里导航到此文件夹(注意,我将我的卷命名为postgresql卷):

/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中。

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

您还可以在Docker for windows中找到图像位置,转到设置-

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

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

 类似资料:
  • 我想建立一个Docker图像,包括我的自定义Powershell模块。因此,我使用Microsofts图像,我想从这里创建我自己的图像,其中包括我的psm1文件。 我想把C:\temp\someDirectory中包含的文件复制到docker linux容器中。在构建映像时,我得到以下错误: C:\temp\docker_posh>docker build--rm-f dockerfile-t d

  • 问题内容: 我们可以在docker中拥有一个数据量: 但是,如果数据量存在,则与使用装入文件夹中的数据有什么不同? 问题答案: 它与使用-v / path / to / data / in / container:/ home / user / a_good_place_to_have_data装入文件夹中的数据有何不同? 这是因为,如“ 将主机目录装载为数据卷 ”中所述 主机目录从本质上说是依赖

  • 问题内容: 我需要从多个JSON文件中加载数据,每个文件中都有多个记录到Postgres表中。我正在使用以下代码,但无法正常工作(在Windows上使用pgAdmin III) SAMPLE.JSON文件的内容是这样的(从许多这样的记录中得到两个记录): 问题答案: 试试这个:

  • 我已经把Kafka和博士后的成绩记录下来了。我使用JDBC接收器连接器将数据从Kafka主题加载到Postgres表。首先,我用“AVRO”值格式创建一个主题和一个主题上方的流。 以下是创建接收器连接器的代码: 然后,我使用命令检查Postgres是否有来自Kafka的数据,它返回以下信息:

  • 挂载主机目录 挂载一个主机目录作为数据卷 使用 --mount 标记可以指定挂载一个本地主机的目录到容器中去。 $ docker run -d -P \ --name web \ # -v /src/webapp:/opt/webapp \ --mount type=bind,source=/src/webapp,target=/opt/webapp \ training/

  • 我有一个docker compose文件,看起来像: 运行之后,我看到所有的服务都启动了,并且看起来工作良好。我的服务使用以下sqlalchemy连接字符串连接到postgres: 编辑:这是在接受的解决方案中的一个评论中回答的,但我认为值得在这里指出:我已经在本地运行postgres,这引起了各种混乱。 删除我的本地postgres实例并更新我的hosts文件,就像接受的答案中提到的那样,一切都