一尘不染

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

docker

我试图从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******"

反斜杠似乎是必需的,因为否则会出现解析错误。该脚本运行无误,除CREATE TABLE命令外的所有命令似乎都起作用。

单用户模式不支持表创建吗?如果是这样,是否有更好的方法让dockerfile使用在postgres中创建的表来设置映像?


阅读 312

收藏
2020-06-17

共1个答案

一尘不染

@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******"
2020-06-17