Windows 本地数据库窗口中不存在Postgres Docker容器表
从windows,我从本地计算机连接到Postgres Docker容器。但我看不到postgres容器中存在的表。数据未在本地复制。我跟着这个 用于在windows上运行postgres容器 我设法从转储文件创建了表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
$ 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,并创建了表?本教程没有关于创建模式的任何部分。请在问题中添加创建表格的尝试。