在Docker的PostgreSQL容器中导入PostgreSQL数据库

5

我正在尝试将一个现有的数据库导入到一个 postgres docker 容器中。下面是我的步骤:

docker run --name pg-docker -e POSTGRES_PASSWORD=***** -d -p 5432:5432 -v BCS/postgres_data postgres

然后,

docker exec -it pg-docker bash
psql -U postgres
postgres=# CREATE DATABASE myDB;
psql -U postgres myDB < BCS/mydb.sql

但是当我执行\dt命令时,出现了这个错误未找到任何关系。 已知我的数据库已经有表格。 那么我做错了什么?

为什么不将你的 SQL 文件复制到 /docker-entrypoint-initdb.d/ 目录下呢? - LinPy
我将这个指令添加到我的dockerFile中,那么如何验证我的数据库是否成功导入? - rota90
3个回答

6

首先,最好采用@LinPy提到的方法。

或者最好在构建时进行复制。

Dockerfile

FROM postgres
COPY mydb.sql /docker-entrypoint-initdb.d/

另一个选项是,您只需要为数据库创建编写脚本。
FROM postgres
ENV POSTGRES_DB=mydb

它将为您创建数据库。

POSTGRES_DB

这个可选的环境变量可以用来定义在镜像首次启动时创建的默认数据库的不同名称。如果没有指定,则使用POSTGRES_USER的值。

以上,Postgres入口点将负责SQL脚本。

第二件事,与数据库名称相关的当前问题,除非进行某些技巧,否则Postgress不会简单地将它们视为大写。

Postgresql将db名称视为小写,标准化处理。但是,postgresapi中的字段不会复制此行为,因此允许您创建具有大写字母的数据库。修复方法可能是警告用户不允许在db名称中使用大写字母,并向API添加验证规则以防止用户创建此类数据库。

postgres-api

将您的命令更改为创建DB

docker exec -it pg-docker bash
psql -U postgres
postgres=# CREATE DATABASE myDB;

验证数据库

postgres=# \l
                                 List of databases
   Name    |  Owner   | Encoding |  Collate   |   Ctype    |   Access privileges   
-----------+----------+----------+------------+------------+-----------------------
 mydb      | postgres | UTF8     | en_US.utf8 | en_US.utf8 | 
 postgres  | postgres | UTF8     | en_US.utf8 | en_US.utf8 | 
 template0 | postgres | UTF8     | en_US.utf8 | en_US.utf8 | =c/postgres          +

所以导入命令将会是:

psql -U postgres mydb < BCS/mydb.sql

或者

psql  -d mydb -U postgres -f ab.sql


我将此指令添加到我的Docker文件中,那么如何验证我的数据库是否已成功导入? - rota90
可以使用任何PostgreSQL客户端连接,或者您可以从命令行确认。 - Adiii

5

您还可以将SQL脚本重定向到容器中,如下所示:

Postgres用户:

docker exec -i my-postgres-container psql -U postgres < created-db.sql

普通用户:

docker exec -i my-postgres-container psql -d my-db -U my-user < create-schema.sql

1
如果您确定数据库已正确安装,但仍未看到表格,请检查以下两个事项:
  • 连接时,您是否连接到了正确的数据库?如果您在终端中使用psql,则可以使用-d开关指定数据库。
 psql -h <host> -U <user> -d <dbname>

你可以在连接后使用\connect <dbname>命令更改数据库。
  • 你确定指定了正确的模式吗? \dt将显示表,但你需要先使用set schema指定一个模式:
postgres=# \dt

...
<no tables>
...

postgres=# set schema 'my_schema';
postgres=# \dt

...
<my tables>
...


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接