繁体   English   中英

Postgres Docker 本地数据库中不存在容器表 windows

[英]Postgres Docker Container tables not present in local DB windows

从 windows,我从本地机器连接到 Postgres Docker 容器。 但我看不到 postgres 容器中存在的表。 数据未在本地复制。 我按照本教程在 windows 上运行 postgres 容器。

我设法从转储文件创建表。

$ docker volume create --name postgres-volume

$ docker run -p 5432:5432 --name postgres_db -e POSTGRES_PASSWORD=password -v postgres-volume:/var/lib/postgresql/data -d postgres

$ docker exec -it <container-id> bash -c "pg_dump -h <source-url> -U postgres  -d postgres > /tmp/dump.sql"

$ docker exec -it <container-id> bash -c "psql -f /tmp/dump.sql -U postgres -d postgres"

任何帮助,不胜感激。

容器

容器旨在成为程序/服务的隔离实例。 它们与同一图像的主机和后续衍生产品都隔离开来。 他们从一个孤立的岛屿开始,里面什么都没有(它不是自己带来的)。 他们生成的任何数据都会在他们死后丢失。 他们也完全忘记了主机上的任何数据(目前)。 但是,有时,我们希望他们的数据是持久的,或者在他们每次启动时“注入”我们自己的数据。 例如您的案例PostgreSQL 我们希望PostgreSQL每次启动时都能使用我们的模式。 而且,如果它保留了我们所做的任何更改或我们加载的数据,那就太好了。

Docker 卷

输入docker 卷 这是管理容器持久存储的好方法。 它们旨在安装在容器中,并让它们写入数据(或从先前的实例中读取),如果容器实例被删除,这些数据也不会被删除。 使用docker volume create myvolume1 ,它将在/var/lib/docker/volumes/中创建一个目录(在 windows 上,它将是另一个默认值。可以更改)。 您永远不必知道主机上的物理目录。 您只需要知道卷名myvolume1 (或您选择的任何名称)。

具有持久数据的容器(docker 卷)

正如我们所说,默认情况下,容器与主机完全隔离。 特别是它的文件系统。 这意味着,当容器启动时,它不知道主机的文件系统上有什么。 而且,当容器实例被删除时,它在其生命周期中生成的数据也会随之消失。
但是,如果我们使用docker volumes ,情况会有所不同。 在容器启动时,我们可以从“外部”装载数据。 这些数据可以是我们之前提到的docker volume ,也可以是我们想要的特定路径(例如我们自己管理的 /home/me/somethingimport)。 后者不是docker volume ,但工作原理相同。

教程

您链接的教程讨论了安装路径和docker volume (在单独的示例中)。 当您执行docker run时,这是使用-v标志完成的。 Because using docker on windows, there is an issue with permissions to the PostgreSQL data directory on the host (which is mounted in the container), they recommend using docker volumes .
这意味着在将docker volumePostgreSQL实例一起使用后,您必须创建架构并加载所需的任何数据。 容器的后续重启必须使用相同的docker volume

docker volume create --name postgres-volume

docker run -p 5432:5432 --name postgres_db -e POSTGRES_PASSWORD=password -v postgres-volume:/var/lib/postgresql/data -d postgres

从教程

这是两条重要的线。 第一个创建创建docker volume ,第二个创建PostgreSQL实例。 您对该实例的数据 (DML DDL) 所做的任何更改都将保存在docker volume postgres-volume中。 如果您之前启动了使用该卷的容器(例如PostgreSQL ),它将找到上次留下的数据。 换句话说,使第二行成为实例的原因是docker volume是空的(它刚刚创建)。 PostgreSQL的后续实例将找到您之前加载的架构+数据。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM