database - 在PostgreSQL容器启动时创建多个数据库

标签 database postgresql docker initialization docker-container

我想在容器启动时创建多个数据库。我使用postgres:11.2作为基本图像。

在这里阅读文档https://hub.docker.com/_/postgres和这篇博文How to create User/Database in script for Docker Postgres之后,当容器启动时,我仍然无法创建多个数据库。

我尝试了以下解决方案:

第一与init.sh:

#!/bin/bash
set -e

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

    CREATE DATABASE productservice;
    GRANT ALL PRIVILEGES ON DATABASE productservice TO owner;

    CREATE DATABASE usersservice;
    GRANT ALL PRIVILEGES ON DATABASE usersservice TO owner;

    CREATE DATABASE financeservice;
    GRANT ALL PRIVILEGES ON DATABASE financeservice TO owner;

    CREATE DATABASE relationshipservice;
    GRANT ALL PRIVILEGES ON DATABASE relationshipservice TO owner;

    CREATE DATABASE securityservice;
    GRANT ALL PRIVILEGES ON DATABASE securityservice TO owner;
EOSQL

并在Dockerfile
ENV INIT_DIR /docker-entrypoint-initdb.d
RUN mkdir -p ${INIT_DIR}
COPY init.sh ${INIT_DIR}

我没有收到任何错误,但是既没有创建数据库也没有创建用户,仅存在默认的postgres数据库。

第二与init.sql
CREATE USER owner;

CREATE DATABASE productservice;
GRANT ALL PRIVILEGES ON DATABASE productservice TO owner;

CREATE DATABASE chicoweursservice;
GRANT ALL PRIVILEGES ON DATABASE usersservice TO owner;

CREATE DATABASE financeservice;
GRANT ALL PRIVILEGES ON DATABASE financeservice TO owner;

CREATE DATABASE relationshipservice;
GRANT ALL PRIVILEGES ON DATABASE relationshipservice TO owner;

CREATE DATABASE securityservice;
GRANT ALL PRIVILEGES ON DATABASE securityservice TO owner;

并将Dockerfile更改为
ENV INIT_DIR /docker-entrypoint-initdb.d
RUN mkdir -p ${INIT_DIR}
COPY init.sql ${INIT_DIR}

结果与第一种情况相同。

谢谢你的帮助。

编辑:

完整的Dockerfile
FROM postgres:11.2
ENV PGDATA /var/lib/postgresql/data/pgdata
ENV INIT_DIR /docker-entrypoint-initdb.d
RUN mkdir -p ${INIT_DIR}
COPY init.sql ${INIT_DIR}
RUN localedef -i fr_FR -c -f UTF-8 -A /usr/share/locale/locale.alias fr_FR.UTF-8
ENV LANG en_US.UTF-8
VOLUME ${PGDATA}

最佳答案

各种标准数据库容器仅在首次运行时才进行设置。这包括创建用户,设置root密码以及在/docker-entrypoint-initdb.d目录中运行之类的事情。如果未在docker run命令行中提供卷,则通常还将它们配置为将其基础数据存储在匿名卷中。

如果数据库由命名卷支持,则需要删除并重新创建该卷:

docker stop postgres
docker rm postgres
docker volume rm postgres_data
docker volume create postgres_data
docker run -d -p 5432:5432 -v postgres_data:/var/lib/postgresql/data my-postgres

如果它由文件系统路径(-v $PWD/pgdata:...)支持,则需要先rm -rf,然后再mkdir该目录。

如果您根本没有指定docker run -v选项,那么Doc​​ker将自动创建一个匿名卷。删除旧容器时,docker rm -v也将删除该卷,或者docker volume ls将帮助您找到其长ID。

关于database - 在PostgreSQL容器启动时创建多个数据库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55884150/

相关文章:

mysql - 我可以将 2 个不同的查询(返回单个记录)合并到一个返回单个记录的查询中吗?

MySQL随机排序并保存在数据库中,无需ID

Docker-compose:查看容器内设置了哪些环境变量

docker - 如何确定扩展服务的副本数

docker - docker 如何缓存图像数据?

ruby-on-rails - 使用 Heroku Web 界面,如何将 PG 数据库从 Heroku 导出为 CSV 文件?

python - 从python中的数组中选择随机样本

POSTGRESQL外键引用两个不同表的主键

SQL 查询将字段递增该字段中的前一个数字

python - 如何使用 GROUP BY 和 HAVING 与 SQLAlchemy 和 Postgresql 获取具有最大更新日期时间的行