Создание нескольких баз данных при запуске контейнера PostgreSQL - PullRequest
0 голосов
/ 27 апреля 2019

Я хотел бы создать несколько баз данных при запуске контейнера.Я использую postgres:11.2 в качестве базового изображения.

После прочтения документа здесь https://hub.docker.com/_/postgres и этого поста Как создать пользователя / базу данных в сценарии для Docker Postgres , я до сих порневозможно создать несколько баз данных при запуске контейнера.

Я пробовал следующие решения:

1-й с 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.

2nd с 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}

1 Ответ

0 голосов
/ 27 апреля 2019

Различные стандартные контейнеры базы данных выполняют настройку только при первом запуске. Это включает в себя такие вещи, как создание пользователей, установка пароля 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 поможет вам найти его длинный идентификатор.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...