postgresql - 在 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.
那么我做错了吗?
解决方案
首先最好采用@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 添加验证规则以阻止用户创建此类数据库。
更改您的命令以创建数据库
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
推荐阅读
- regex - 提取可能包含嵌套括号的括号之间的内容并将剩余内容分组为一个整体以存储在地图中
- c# - 为什么单击立方体作为按钮时文本不再起作用?
- php - 域重定向到 apache 子文件夹并从 url 中删除扩展
- regex - Perl 正则表达式变量替换打印 1 而不是所需的提取
- google-calendar-api - 谷歌日历 api 中的无效令牌错误
- reactjs - 如何根据我的数据自动设置每页?
- reactjs - 我们如何在同一页面上的两个 React 组件之间共享状态变量?
- django - 如何对 Jinja 模板中的变量求和
- javascript - 将道具传递给状态以在类组件中使用
- tsql - 如何从另一个数据库访问一个数据库的表,两个数据库都在sqlserver的同一台服务器上