【问题标题】:Importing postgres database in a docker postgres container在 docker postgres 容器中导入 postgres 数据库
【发布时间】:2020-02-20 17:34:00
【问题描述】:

我正在尝试将现有数据库导入 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 时我有这个错误Did not find any relations. 知道我的数据库已经有表。 那我做错了吗?

【问题讨论】:

  • 为什么不把你的sql文件复制到/docker-entrypoint-initdb.d/
  • 我将此指令添加到我的dockerFile中,那么如何验证我的数据库是否正确导入?

标签: postgresql docker


【解决方案1】:

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

或者最好在构建时复制。

Dockerfile

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

另一种选择,您确实需要为创建数据库编写脚本。

FROM postgres
ENV POSTGRES_DB=mydb

将为您创建数据库。

POSTGRES_DB

此可选环境变量可用于定义不同的 首次创建映像时创建的默认数据库的名称 开始了。如果未指定,则 POSTGRES_USER 的值将 使用。

在上面,Postgres entrypoint 将负责 SQL 脚本。

第二件事,数据库名称的当前问题,Postgress 不会简单地以大写形式处理它们,除非你做了一些trick

Postgresql 将数据库名称视为小写,规范化。然而 postgresapi 中的字段不会复制此行为,因此 允许您使用大写字母创建数据库。修复可以 是警告用户数据库中不允许使用大写字母 aname 并将验证规则添加到 API 以停止用户 创建这样的数据库。

postgres-api

将您的命令更改为 创建数据库

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

【讨论】:

  • 我将此指令添加到我的dockerFile中,那么如何验证我的数据库是否正确导入?
  • 与任何 postgress 客户端连接,或者您可以通过类似命令确认。
【解决方案2】:

如果您确定数据库正确安装了所有内容,您是否仍然看不到表,您应该仔细检查两件事:

  • 连接时,是否连接到正确的数据库?如果您在终端中使用psql,则使用-d 开关指定数据库。
 psql -h <host> -U <user> -d <dbname>

您也可以在连接后使用\connect &lt;dbname&gt; 命令更改数据库。

  • 您是否指定了正确的架构? \dt 将向您显示表格,但您需要先使用 set schema 指定架构:
postgres=# \dt

...
<no tables>
...

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

...
<my tables>
...

【讨论】:

    猜你喜欢
    • 2017-05-14
    • 1970-01-01
    • 1970-01-01
    • 2023-04-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-12
    相关资源
    最近更新 更多