在postgres中以单用户模式创建表

sda*_*dab 8 postgresql docker dockerfile

我试图从postgres图像创建一个Dockerfile.回购说,应该通过在/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******"
Run Code Online (Sandbox Code Playgroud)

反斜杠似乎是必需的,否则我得到一个解析错误.该脚本运行时没有错误,除了CREATE TABLE命令之外的所有命令似乎都有效.

是否在单用户模式下不支持表创建?如果是这样,有没有更好的方法让dockerfile设置一个包含在postgres中创建的表的图像?

sda*_*dab 10

@a_horse_with_no_name通过他的评论让我走上正轨.我决定放弃单用户模式,即使它是"推荐".相反,我用pg_ctl启动postgres,加载一些包含我的表创建的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******"
Run Code Online (Sandbox Code Playgroud)


Cra*_*ger 5

如果要在完成所需的任何设置之前阻止用户访问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...
Run Code Online (Sandbox Code Playgroud)

即启动PostgreSQL不监听任何TCP/IP套接字,并使用非默认值unix_socket_directories.做你的设置.然后使用默认(或已配置)重新启动它,unix_socket_directories并且listen_addresses一旦准备好进行常规访问.

而不是这个你可以:

  • 修改pg_hba.conf为仅允许您的设置用户访问/仅允许访问环回地址/ etc
  • 启动Pg
  • 做你的设置
  • 替换pg_hba.conf为生产一个
  • pg_ctl reload或SELECT pg_reload_conf()加载新设置并允许一般访问

...但是,这将允许应用程序连接,然后在设置阶段拒绝其身份验证; 这可能不是你想要的,并非所有应用程序都能正确应对.