инициализировать контейнер postgres из файла docker-compose - PullRequest
0 голосов
/ 06 октября 2019

Я пытаюсь запустить файл docker-compose формы контейнера postgres, а также инициализировать его.

docker-compose.yml

version: "3"
  postgres:
  image: "postgres"
  command: bash -c "
   postgres &&
   createuser -l \"auser\"
   "

Моя цель: 1) запустить контейнер postgres2) создать пользователя

Текущая реализация завершается ошибкой со следующей ошибкой

"root" execution of the PostgreSQL server is not permitted.
The server must be started under an unprivileged user ID to prevent
possible system security compromise.  See the documentation for
more information on how to properly start the server.

1 Ответ

3 голосов
/ 06 октября 2019

«root» выполнение сервера PostgreSQL не разрешено.

Запрещается запускать контейнер БД с пользователем root. Лучше запустить postgres user.

. Один из способов - указать пользователя в docker-compose.

postgres:
  image: postgres
  container_name: postgres
  user: postgres
  ports:
    - "5432:5432"
  command: 'postgres'

Но при

  command: bash -c "
   postgres &&
   createuser -l \"auser\"
   "

во время созданияПользовательская команда, может случиться так, что БД не готова принять соединение.

Таким образом, у вас есть два лучших варианта.

  • Использование переменных среды

POSTGRES_USER

Эта необязательная переменная среды используется вместе с POSTGRES_PASSWORD для установки пользователя и его пароля. Эта переменная создаст указанного пользователя с полномочиями суперпользователя и базу данных с тем же именем. Если она не указана, будет использоваться пользователь по умолчанию postgres .

postgres:
  image: postgres
  container_name: postgres
  environment:
    POSTGRES_USER: test
    POSTGRES_PASSWORD: password
    POSTGRES_DB: myapp
  user: postgres
  ports:
    - "5432:5432"

Второй параметр

Сценарии инициализации

Если вы хотите выполнить дополнительную инициализацию изображения, полученного из этого,добавьте один или несколько *.sql, *.sql.gz, or *.sh scripts в /docker-entrypoint-initdb.d (создавая каталог при необходимости). После того, как точка входа вызовет initdb для создания пользователя и базы данных postgres по умолчанию, она запустит любые *.sql files, запустит любые исполняемые *.sh сценарии и найдет все неисполняемые *.sh сценарии, найденные в этом каталоге, для дальнейшей инициализации перед запуском. услуга.

Например, чтобы добавить дополнительного пользователя и базу данных , добавьте следующее к /docker-entrypoint-initdb.d/init-user-db.sh:

#!/bin/bash
set -e

psql -v ON_ERROR_STOP=1 --username "$POSTGRES_USER" --dbname "$POSTGRES_DB" <<-EOSQL
    CREATE USER docker;
    CREATE DATABASE docker;
    GRANT ALL PRIVILEGES ON DATABASE docker TO docker;
EOSQL
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...