首页 > 解决方案 > 在 docker postgres 容器中导入 postgres 数据库

问题描述

我正在尝试将现有数据库导入 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. 那么我做错了吗?

标签: postgresqldocker

解决方案


首先最好采用@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 将数据库名称视为小写,规范化。但是,postgresapi 中的字段不会复制此行为,因此允许您使用大写字母创建数据库。修复可能是警告用户在 db 名称中不允许使用大写字母,并向 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


推荐阅读