Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Windows 本地数据库窗口中不存在Postgres Docker容器表_Windows_Postgresql_Docker_Containers - Fatal编程技术网

Windows 本地数据库窗口中不存在Postgres Docker容器表

Windows 本地数据库窗口中不存在Postgres Docker容器表,windows,postgresql,docker,containers,Windows,Postgresql,Docker,Containers,从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

从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"
$docker volume create--命名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 bash-c“pg_dump-h-U postgres-d postgres>/tmp/dump.sql”
$docker exec-it bash-c“psql-f/tmp/dump.sql-U postgres-d postgres”
任何帮助,谢谢。

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

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

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

您链接的教程讨论了装载路径和
docker卷
(在单独的示例中)。这是在执行
docker run
时使用
-v
标志完成的。由于在windows上使用
docker
,主机上的
PostgreSQL
数据目录(装载在容器中)的权限存在问题,因此他们建议使用
docker卷

这意味着您必须在对
PostgreSQL
实例使用
docker卷
后创建模式并加载所需的任何数据。容器的后续重新启动必须使用相同的
docker卷

docker卷创建——命名postgres卷
docker run-p 5432:5432--name postgres_db-e postgres_PASSWORD=PASSWORD-v postgres volume:/var/lib/postgresql/data-d postgres
来自教程


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

当您将同一docker卷装载到PostgreSQL的数据路径时,在容器重新启动后,这些表将消失?之前这些表都不存在。我是否应该将本地数据库映射到任何路径。?“Docker Postgres表”是指默认存在于数据库中的默认系统目录吗?@AliTou No!!我创建的自定义表。您的容器在
/tmp/dump.sql
中是否有任何文件?默认情况下,容器的文件系统根是空的,您必须装载一个卷(正如@edd在他的回答中所说的),或者在构建时将其填充到Dockerfile中。由于在您的步骤中没有显示您正在执行的任何操作,我认为上面的命令不会创建任何表,因为那里没有
/tmp/dump.sql
。这是一个非常清楚的信息,但一切都很顺利,除了从windows,在从我的系统本地连接到数据库之后,指定数据库的
架构
为空。容器无法将架构信息(表)传递给我的machine@RahulReddy您是否传递了
/docker entrypoint initdb.d
的卷?这是数据库检查的目录,用于最初创建模式等@AliTou!!我会查的it@RahulReddy您是如何创建表的?你
exec
ed在postgres中,得到了一个psql shell,并创建了表?本教程没有关于创建模式的任何部分。请在问题中添加创建表格的尝试。