Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
postgresql 11 docker创建自定义数据库_Postgresql_Docker - Fatal编程技术网

postgresql 11 docker创建自定义数据库

postgresql 11 docker创建自定义数据库,postgresql,docker,Postgresql,Docker,我想创建自定义脚本,它将创建数据库连接到它并初始化模式。因此,我创建了以下shell脚本: 文件:100\u sample\u create.sh #!/bin/bash mkdir -p /var/lib/postgresql/tablespaces/SAMPLECLIENT mkdir -p /var/lib/postgresql/tablespaces/SAMPLEINDEX set -e psql -v ON_ERROR_STOP=1 --username "$POSTGRES_USER

我想创建自定义脚本,它将创建数据库连接到它并初始化模式。因此,我创建了以下shell脚本:

文件:
100\u sample\u create.sh

#!/bin/bash
mkdir -p /var/lib/postgresql/tablespaces/SAMPLECLIENT
mkdir -p /var/lib/postgresql/tablespaces/SAMPLEINDEX
set -e
psql -v ON_ERROR_STOP=1 --username "$POSTGRES_USER" --dbname "$POSTGRES_DB" <<-EOSQL
  CREATE ROLE SAMPLEOWNER;
  CREATE USER SAMPLE WITH ENCRYPTED PASSWORD 'samplepwd';
  GRANT SAMPLEOWNER TO SAMPLE;
  CREATE TABLESPACE SAMPLECLIENT OWNER SAMPLEOWNER LOCATION '/var/lib/postgresql/tablespaces/SAMPLECLIENT';
  CREATE TABLESPACE SAMPLEINDEX OWNER SAMPLEOWNER LOCATION '/var/lib/postgresql/tablespaces/SAMPLEINDEX';
  CREATE DATABASE SAMPLE OWNER SAMPLEOWNER ENCODING 'UTF-8' TABLESPACE SAMPLECLIENT CONNECTION LIMIT -1;
EOSQL
#!/bin/bash
set -e
psql -v ON_ERROR_STOP=1 --username "SAMPLEOWNER" --dbname "SAMPLE" <<-EOSQL
  CREATE SCHEMA SAMPLE;
  ALTER SCHEMA SAMPLE OWNER TO SAMPLEOWNER;
  ALTER DATABASE SAMPLE SET search_path TO SAMPLE;
  ALTER ROLE SAMPLEOWNER SET search_path TO SAMPLE;
  ALTER ROLE SAMPLEOWNER SET default_tablespace = SAMPLECLIENT;
  GRANT ALL ON DATABASE SAMPLE TO SAMPLEOWNER;
  GRANT ALL ON SCHEMA SAMPLE TO SAMPLEOWNER;
  GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA SAMPLE TO SAMPLEOWNER;
EOSQL
文件
docker compose.yml

version: "3"
services:
  sample-postgres:
    image: "postgres:11"
    container_name: "sample-postgres"
    ports:
      - "5432:5432"
    environment:
      - POSTGRES_PASSWORD=Password1.
    volumes:
      - ./100_sample_create.sh:/docker-entrypoint-initdb.d/100_sample_create.sh
      - ./110_sample_init.sh:/docker-entrypoint-initdb.d/110_sample_init.sh
但是,当启动容器时,出现以下错误:

/usr/local/bin/docker-entrypoint.sh: running /docker-entrypoint-initdb.d/110_sample_init.sh
2019-05-22 13:56:05.603 UTC [72] FATAL:  role "SAMPLEOWNER" does not exist
psql: FATAL:  role "SAMPLEOWNER" does not exist
这是否意味着用户仅在
$POSTGRES_DB
数据库中创建,而在
示例
DB中不可用?如何更改脚本以正确创建自定义数据库并初始化它?我知道我可以使用docker参数自定义db的名称,但我想通过脚本来实现这一点,因为我需要在容器中有更多的数据库。

您使用的命令:

CREATE ROLE SAMPLEOWNER; 
创建名为sampleowner的角色(全部小写)。如果您确实希望它是大写的,请使用:

CREATE ROLE "SAMPLEOWNER";
您使用的命令:

CREATE ROLE SAMPLEOWNER; 
创建名为sampleowner的角色(全部小写)。如果您确实希望它是大写的,请使用:

CREATE ROLE "SAMPLEOWNER";

来自文档:`您必须具有CREATEROLE权限或数据库超级用户才能使用此命令',您是超级用户还是具有此权限?你对哪个问题有何评论?应创建角色SAMPLEOWNER,因为执行过程中没有错误。从文档中可以看出:`您必须具有CREATEROLE权限或是数据库超级用户才能使用此命令',您是超级用户还是具有此权限?你对哪个问题有何评论?应创建角色SAMPLEOWNER,因为执行过程中没有错误。谢谢,另外一件事是将
LOGIN
添加到角色
SAMPLEOWNER
创建脚本。是的,因为它是作为角色创建的,所以默认情况下它没有登录权限。如果将单词ROLE替换为USER,默认情况下它将获得这些权限(这是两个命令之间的唯一区别)。谢谢,另外一件事是将
LOGIN
添加到ROLE
SAMPLEOWNER
创建脚本中。是的,因为它是作为角色创建的,所以默认情况下它没有登录权限。如果将单词ROLE替换为USER,默认情况下它将获得这些权限(这是两个命令之间的唯一区别)。