在 PostgreSQL 容器启动时创建多个数据库
Create multiple databases at PostgreSQL container startup
我想在容器启动时创建多个数据库。我使用 postgres:11.2
作为基础图像。
阅读这里的文档https://hub.docker.com/_/postgres and this post 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
选项,那么 Docker 将自动创建一个匿名卷。当您删除旧容器时,docker rm -v
也会删除该卷,或者 docker volume ls
会帮助您找到它的长 ID。
我想在容器启动时创建多个数据库。我使用 postgres:11.2
作为基础图像。
阅读这里的文档https://hub.docker.com/_/postgres and this post 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
选项,那么 Docker 将自动创建一个匿名卷。当您删除旧容器时,docker rm -v
也会删除该卷,或者 docker volume ls
会帮助您找到它的长 ID。