在 postgres 中以单用户模式创建 table
Creating a table in single user mode in postgres
我正在尝试从 postgres 映像创建 Dockerfile。 repo 说初始化应该通过在 /docker-entrypoint-initdb.d/ 中放置一个 shell 脚本来处理。我根据我在网上找到的示例放置了以下脚本:
#!/bin/bash
echo "******CREATING DOCKER DATABASE******"
gosu postgres postgres --single <<- EOSQL
CREATE DATABASE orpheus;
CREATE USER docker WITH ENCRYPTED PASSWORD 'pwd_docker';
GRANT ALL PRIVILEGES ON DATABASE orpheus to docker;
CREATE TABLE profiles ( \
profile_id SERIAL UNIQUE PRIMARY KEY, \
user_id integer NOT NULL UNIQUE, \
profile_photo_id integer NOT NULL UNIQUE, \
age integer \
);
CREATE TABLE hidden_user ( \
owner_id integer NOT NULL PRIMARY KEY, \
target_id integer NOT NULL \
);
EOSQL
echo ""
echo "******DOCKER DATABASE CREATED******"
反斜杠似乎是必需的,否则我会收到解析错误。脚本运行没有错误,除 CREATE TABLE 命令外的所有命令似乎都有效。
难道单用户模式不支持table创建?如果是这样,是否有更好的方法让 docker 文件使用在 postgres 中创建的 tables 设置图像?
@a_horse_with_no_name 他的评论让我走上正轨。我决定放弃单用户模式,即使它是 "recommended"。相反,我使用 pg_ctl 启动 postgres,加载一些包含我的 table 创建的 sql 文件,并使用 pg_ctl 停止服务器。
我的 shell 脚本如下所示:
#!/bin/bash
echo "******CREATING DOCKER DATABASE******"
echo "starting postgres"
gosu postgres pg_ctl -w start
echo "bootstrapping the postgres db"
gosu postgres psql -h localhost -p 5432 -U postgres -a -f /db/bootstrap.sql
echo "initializing tables"
gosu postgres psql -h localhost -p 5432 -U postgres -d orpheus -a -f /db/setup.sql
echo "stopping postgres"
gosu postgres pg_ctl stop
echo "stopped postgres"
echo ""
echo "******DOCKER DATABASE CREATED******"
如果您想在完成您需要执行的任何设置之前阻止用户访问 PostgreSQL,请仅使用环回访问或仅使用 unix 套接字启动它,进行初始化,然后重新启动它以进行一般访问。
我不会说 Docker,但如果您在常规环境中这样做,您会做类似的事情:
mkdir -p /db/temp_socket
chown -r postgres:postgres /db
PGHOST=/db/temp_socket pg_ctl -D /path/to/datadir -o "-c listen_addresses='' -c unix_socket_directories='/db/temp_socket'" -l "/db/dbsetup.log" -w start
# Do your work
PGHOST=/db/temp_socket psql -f some_script
PGHOST=/db/temp_socket pg_ctl -D /path/to/datadir -m fast -w stop
pg_ctl -D /path/to/datadir -w start ...normalstartupoptionsblah...
即启动 PostgreSQL 不监听任何 TCP/IP 套接字,并且使用非默认 unix_socket_directories
。做你的设置。然后使用默认(或配置)unix_socket_directories
和 listen_addresses
重新启动它,一旦它准备好进行一般访问。
除此之外,您还可以:
- 修改
pg_hba.conf
以仅允许您的设置用户访问/仅在环回地址/等上
- 开始页面
- 进行设置
- 将
pg_hba.conf
替换为生产
pg_ctl reload
或 SELECT pg_reload_conf()
加载新设置并允许一般访问
...然而,这将允许应用程序连接然后在设置阶段拒绝他们的身份验证;这可能不是您想要的,而且并非所有应用程序都能正确应对。
我测试了你的脚本,它几乎可以正常工作。使用 Postgresql 9.4 我设法使以下工作:
gosu postgres postgres --single -jE <<- EOSQL
CREATE DATABASE orpheus;
EOSQL
echo
gosu postgres postgres --single -jE orpheus <<- EOSQL
CREATE USER docker WITH ENCRYPTED PASSWORD 'pwd_docker';
GRANT ALL PRIVILEGES ON DATABASE orpheus to docker;
CREATE TABLE profiles (
profile_id SERIAL UNIQUE PRIMARY KEY,
user_id integer NOT NULL UNIQUE,
profile_photo_id integer NOT NULL UNIQUE,
age integer
);
CREATE TABLE hidden_user (
owner_id integer NOT NULL PRIMARY KEY,
target_id integer NOT NULL
);
EOSQL
echo
基本上我不得不将脚本分成两部分,因为 postgresql 抱怨说 create database
不能用于多行脚本。另一个只是在第二个命令中添加数据库名称 orpheus
。
瞧瞧
我正在尝试从 postgres 映像创建 Dockerfile。 repo 说初始化应该通过在 /docker-entrypoint-initdb.d/ 中放置一个 shell 脚本来处理。我根据我在网上找到的示例放置了以下脚本:
#!/bin/bash
echo "******CREATING DOCKER DATABASE******"
gosu postgres postgres --single <<- EOSQL
CREATE DATABASE orpheus;
CREATE USER docker WITH ENCRYPTED PASSWORD 'pwd_docker';
GRANT ALL PRIVILEGES ON DATABASE orpheus to docker;
CREATE TABLE profiles ( \
profile_id SERIAL UNIQUE PRIMARY KEY, \
user_id integer NOT NULL UNIQUE, \
profile_photo_id integer NOT NULL UNIQUE, \
age integer \
);
CREATE TABLE hidden_user ( \
owner_id integer NOT NULL PRIMARY KEY, \
target_id integer NOT NULL \
);
EOSQL
echo ""
echo "******DOCKER DATABASE CREATED******"
反斜杠似乎是必需的,否则我会收到解析错误。脚本运行没有错误,除 CREATE TABLE 命令外的所有命令似乎都有效。
难道单用户模式不支持table创建?如果是这样,是否有更好的方法让 docker 文件使用在 postgres 中创建的 tables 设置图像?
@a_horse_with_no_name 他的评论让我走上正轨。我决定放弃单用户模式,即使它是 "recommended"。相反,我使用 pg_ctl 启动 postgres,加载一些包含我的 table 创建的 sql 文件,并使用 pg_ctl 停止服务器。
我的 shell 脚本如下所示:
#!/bin/bash
echo "******CREATING DOCKER DATABASE******"
echo "starting postgres"
gosu postgres pg_ctl -w start
echo "bootstrapping the postgres db"
gosu postgres psql -h localhost -p 5432 -U postgres -a -f /db/bootstrap.sql
echo "initializing tables"
gosu postgres psql -h localhost -p 5432 -U postgres -d orpheus -a -f /db/setup.sql
echo "stopping postgres"
gosu postgres pg_ctl stop
echo "stopped postgres"
echo ""
echo "******DOCKER DATABASE CREATED******"
如果您想在完成您需要执行的任何设置之前阻止用户访问 PostgreSQL,请仅使用环回访问或仅使用 unix 套接字启动它,进行初始化,然后重新启动它以进行一般访问。
我不会说 Docker,但如果您在常规环境中这样做,您会做类似的事情:
mkdir -p /db/temp_socket
chown -r postgres:postgres /db
PGHOST=/db/temp_socket pg_ctl -D /path/to/datadir -o "-c listen_addresses='' -c unix_socket_directories='/db/temp_socket'" -l "/db/dbsetup.log" -w start
# Do your work
PGHOST=/db/temp_socket psql -f some_script
PGHOST=/db/temp_socket pg_ctl -D /path/to/datadir -m fast -w stop
pg_ctl -D /path/to/datadir -w start ...normalstartupoptionsblah...
即启动 PostgreSQL 不监听任何 TCP/IP 套接字,并且使用非默认 unix_socket_directories
。做你的设置。然后使用默认(或配置)unix_socket_directories
和 listen_addresses
重新启动它,一旦它准备好进行一般访问。
除此之外,您还可以:
- 修改
pg_hba.conf
以仅允许您的设置用户访问/仅在环回地址/等上 - 开始页面
- 进行设置
- 将
pg_hba.conf
替换为生产 pg_ctl reload
或SELECT pg_reload_conf()
加载新设置并允许一般访问
...然而,这将允许应用程序连接然后在设置阶段拒绝他们的身份验证;这可能不是您想要的,而且并非所有应用程序都能正确应对。
我测试了你的脚本,它几乎可以正常工作。使用 Postgresql 9.4 我设法使以下工作:
gosu postgres postgres --single -jE <<- EOSQL
CREATE DATABASE orpheus;
EOSQL
echo
gosu postgres postgres --single -jE orpheus <<- EOSQL
CREATE USER docker WITH ENCRYPTED PASSWORD 'pwd_docker';
GRANT ALL PRIVILEGES ON DATABASE orpheus to docker;
CREATE TABLE profiles (
profile_id SERIAL UNIQUE PRIMARY KEY,
user_id integer NOT NULL UNIQUE,
profile_photo_id integer NOT NULL UNIQUE,
age integer
);
CREATE TABLE hidden_user (
owner_id integer NOT NULL PRIMARY KEY,
target_id integer NOT NULL
);
EOSQL
echo
基本上我不得不将脚本分成两部分,因为 postgresql 抱怨说 create database
不能用于多行脚本。另一个只是在第二个命令中添加数据库名称 orpheus
。
瞧瞧