在docker-compose文件中创建多个PostgreSQL数据库

8

我正在使用PostgreSQL构建一个应用程序…但我需要两个数据库…有没有一种简单的方法可以使用相同的用户名/密码/主机添加两个名为API和TESTING的数据库?

我当前的docker-compose DB设置如下:

# PostgreSQL Service
postgresql:
image: postgres
container_name: postgresql
restart: unless-stopped
tty: true
ports:
  - "5432:5432"
environment:
  - POSTGRES_USER=dev
  - POSTGRES_PASSWORD=development1234
  - POSTGRES_DB=api
  - SERVICE_TAGS=dev
  - PGDATA=/tmp
volumes:
  - ./dev/dbdata:/var/lib/postgresql/data
networks:
  - app-network

这个回答解决了你的问题吗?在Docker和Docker-compose中使用多个数据库 - Eugen Konkov
2个回答

9

您需要创建一个单独的初始化脚本来创建第二个数据库。假设您正在使用列出的 POSTGRES_DB=api,您可以创建一个名为 create_second_db.sh 的脚本,如下所示:

#!/bin/bash
set -e

psql -v ON_ERROR_STOP=1 --username "$POSTGRES_USER" --dbname "$POSTGRES_DB" <<-EOSQL
    CREATE DATABASE testing;
EOSQL

然后,将create_second_db.sh放置在/docker-entrypoint-initdb.d/中:
...
volumes:
  - ./dev/dbdata:/var/lib/postgresql/data
  - ./create_second_db.sh:/docker-entrypoint-initdb.d/create_second_db.sh
...

请记住,根据文档所述,"在/docker-entrypoint-initdb.d目录中的脚本仅在您使用空数据目录启动容器时运行"。参考文档

这似乎不起作用。我得到了以下信息 CREATE DATABASE /usr/local/bin/docker-entrypoint.sh: running /docker-entrypoint-initdb.d/create_second_db.sh /usr/local/bin/docker-entrypoint.sh: line 141: /docker-entrypoint-initdb.d/create_second_db.sh: Is a directory PostgreSQL Database directory appears to contain a database; Skipping initialization - CodeSauce
脚本在我的端上运行正常。根据您粘贴的错误信息,看起来您的集群已经存在于 ./dev/dbdata,因此脚本被跳过了。 - richyen
啊,是的,我不得不关闭音量并重新启动容器。完美地解决了 :) 谢谢! - CodeSauce

6
postgres:
    container_name: postgres
    image: postgres
    volumes:
      - ./docker-postgresql-multiple-databases:/docker-entrypoint-initdb.d
    ports:
      - "5432:5432"
    restart: unless-stopped
    environment:
      - POSTGRES_MULTIPLE_DATABASES=db1,postgres:db2,postgres:db3,postgres
      - POSTGRES_PASSWORD=changeme
      - POSTGRES_USER=postgres

而在文件夹 docker-postgresql-multiple-databases 中,您应该拥有如下脚本:

#!/bin/bash

set -e
set -u

function create_user_and_database() {
    local database=$(echo $1 | tr ',' ' ' | awk  '{print $1}')
    local owner=$(echo $1 | tr ',' ' ' | awk  '{print $2}')
    echo "  Creating user and database '$database'"
    psql -v ON_ERROR_STOP=1 --username "$POSTGRES_USER" <<-EOSQL
        CREATE DATABASE $database;
        GRANT ALL PRIVILEGES ON DATABASE $database TO $owner;
EOSQL
}

if [ -n "$POSTGRES_MULTIPLE_DATABASES" ]; then
    echo "Multiple database creation requested: $POSTGRES_MULTIPLE_DATABASES"
    for db in $(echo $POSTGRES_MULTIPLE_DATABASES | tr ':' ' '); do
        create_user_and_database $db
    done
    echo "Multiple databases created"
fi

POSTGRES_MULTIPLE_DATABASES=db1,postgres:db2,postgres:db3,postgres我一开始没有立刻理解这个格式: db_name,db_owner,以冒号“:”作为分隔符。 - Denis Orlov
我遇到了一个关于角色不存在的数据库错误。在移除 GRANG 命令后,它就正常工作了。因此,一个更简单的 create_database 函数就足够了。 - sKnak
你需要将以下内容进行更改:POSTGRES_MULTIPLE_DATABASES=db1,postgres:db2,postgres:db3,postgres 改为 POSTGRES_MULTIPLE_DATABASES=db1,postgres:db2,postgres:db3,postgres - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接