如何为PostgreSQL Docker容器初始化脚本指定当前工作数据库并确认表存储位置?
这两个问题其实是PostgreSQL Docker镜像初始化时很常见的疑问,我来给你拆解清楚:
1. 如何为初始化脚本指定当前工作数据库?
有两种可靠的方式来指定脚本执行的目标数据库:
方式一:在脚本中使用psql元命令切换数据库
PostgreSQL的命令行工具psql支持用\c(或\connect)元命令切换数据库,你只需要在CREATE TABLE语句前加上这条命令即可。比如你想把表创建在mydatabase这个库中,修改后的init.sql应该是这样:-- 切换到目标数据库 \c mydatabase CREATE TABLE films ( code char(5) CONSTRAINT firstkey PRIMARY KEY, title varchar(40) NOT NULL, did integer NOT NULL, date_prod date, kind varchar(10), len interval hour to minute );Docker的PostgreSQL镜像在执行
/docker-entrypoint-initdb.d/下的脚本时,默认用psql来运行,所以这个元命令会被正确识别执行。方式二:通过容器环境变量指定默认连接数据库
如果你不想修改脚本,也可以在启动容器时设置POSTGRES_DB环境变量,指定默认连接的数据库。比如用docker run命令:docker run -e POSTGRES_DB=mydatabase -v ./init.sql:/docker-entrypoint-initdb.d/init.sql postgres这种情况下,entrypoint会自动连接到
mydatabase来执行你的初始化脚本,脚本里的建表语句就会落在这个库中。不过这种方式依赖容器启动参数,不如在脚本里显式切换更灵活可靠。
2. 默认情况下表会被创建在哪个数据库中?
默认规则分两种情况:
- 如果你启动容器时没有设置
POSTGRES_DB环境变量:PostgreSQL官方镜像会自动创建一个名为postgres的默认数据库,初始化脚本会连接到这个库执行,所以你的films表会被创建在postgres数据库里。 - 如果你启动容器时设置了
POSTGRES_DB环境变量:镜像会创建你指定的这个数据库作为默认连接目标,脚本会在这个指定的数据库中创建表。
简单来说,默认就是镜像初始化时创建的那个默认数据库——要么是自带的postgres,要么是你通过POSTGRES_DB指定的自定义库。
内容的提问来源于stack exchange,提问作者George Pligoropoulos
相关产品推荐
相关产品推荐

