docker compose: postgresql создать базу данных, передать пользователя и предоставить разрешение - PullRequest
0 голосов
/ 19 марта 2019

У меня есть следующий файл docker-compose:

version: '3'
services:
  web:
    build:
      context: ./django_httpd_mod_wsgi
    ports:
     - "8000:80"
  db:
    build:
      context: ./postgresql
    volumes:
       - db-data:/var/lib/postgres/data
volumes:
  db-data:

Я создаю образ psotgresql с использованием archlinux:

Ниже приведен мой файл Docker Postgresql:

FROM archlinux/base

RUN yes | pacman -S postgresql

RUN mkdir /run/postgresql/
RUN chown -R postgres:postgres /run/postgresql/

USER postgres

RUN initdb -D /var/lib/postgres/data

RUN psql -c 'CREATE DATABASE btgapp;' 
RUN psql -c "CREATE USER simha WITH PASSWORD 'krishna';" 
RUN psql -c 'GRANT ALL PRIVILEGES ON DATABASE btgapp TO simha;'

CMD ["/usr/bin/postgres","-D","/var/lib/postgres/data"]

Когда я пытаюсь сделать:

docker-compose up

Я получаю сообщение об ошибке:

psql: could not connect to server: No such file or directory
    Is the server running locally and accepting
    connections on Unix domain socket "/run/postgresql/.s.PGSQL.5432"?
ERROR: Service 'db' failed to build: The command '/bin/sh -c psql -c 'CREATE DATABASE dbname;'' returned a non-zero code: 2

Я понял, что мне нужно запустить psql -c CREATE DATABSE "dbname" после запуска сервера postgresql с помощью /usr/bin/postgres -D /var/lib/postgres/data

Но я не могу запустить несколько команд в Dockerfile.Так как это сделать.

Опция - запустить скрипт.Но тогда будет трудно увидеть, что postgres работает как один процесс.

1 Ответ

1 голос
/ 19 марта 2019

На основании комментариев постараюсь ответить здесь.

Я считаю, что вы должны использовать изображение postgres 11-alpine. И я постараюсь объяснить, почему здесь.

Официальные образы докеров имеют ряд преимуществ, которые вы всегда должны учитывать, прежде чем создавать свои собственные.

  1. Путь обновления прост: - при выходе новой версии приложения, обернутого в образ, официальный образ докера в большинстве случаев будет обновляться вместе с ним. И обычно изменения соответствуют соглашениям о конфигурации, установленным образом. Такие как переменные среды, особенности запуска. Так что пользователи могут просто поменять тег в своих стеках и обновить. Конечно, могут быть критические изменения - всегда проверяйте это.
  2. Большая база пользователей - когда изображения, такие как postgres, были загружены более 10 миллионов раз (2019), это не только означает, что оно популярно, но по сути работает как гарантия того, что изображение было проверено полностью Любые элементарные ошибки уже отсеяны, и вы легко справитесь с изображением.
  3. Оптимизирован по размеру и производительности - вы можете быть уверены, что большое внимание было уделено деталям, минимизируя размер изображения и максимизируя производительность. Многие проекты публикуют свои приложения на нескольких разных дистрибутивах Linux. Как и postgres - они публикуют изображения debian и alpine. Образ alpine является меньшим, тогда как debian немного больше, но дает вам доступ к обширным репозиториям пакетов Debian, если вам нужны дополнительные пакеты.
  4. Простая настройка - разработчики официальных изображений обычно понимают, что случаи использования их пользовательских баз очень хороши. И они пытаются сделать нашу жизнь как разработчиков и администраторов проще (храни их бог). Официальные изображения обычно имеют довольно хорошую документацию, расположенную прямо на целевой странице докера, или ссылку на репозиторий github, где README.md будет охватывать распространенные случаи использования. Я считаю, что эти инструкции заслуживают хорошего прочтения сверху вниз.

Я понимаю, что вы хотите, чтобы изображение было небольшим, но что вы знаете - в проекте postgres ваш сценарий использования покрыт.

Последнее изображение Alpine postgres с тегом 11-alpine имеет сжатый размер 28 МБ и распаковано 70 МБ . В то время как образ archlinux/base, с которого вы хотите начать, имеет сжатый базовый размер 153 МБ и распакованный размер 445 МБ . И это до того, как вы представите сам postgres.

Добавьте к этому, что база данных и пользователь, которого вы хотите создать при запуске, могут обрабатываться только в переменных среды для официального образа postgres. Как это:

docker run -d --name some-postgres \
  -e POSTGRES_PASSWORD=mysecretpassword \
  -e POSTGRES_USER=simha \
  -e POSTGRES_DB=btgapp \
postgres:11-alpine

Если это не охватывает инициализацию, необходимую для вашей базы данных, вы можете скопировать .sql сценарии (и .sh сценарии) в специальное место на изображении - и они будут выполнены при запуске. Для этого вы можете расширить свое изображение так:

init-user-db.sh

#!/bin/bash
set -e

psql -v ON_ERROR_STOP=1 --username "$POSTGRES_USER" --dbname "$POSTGRES_DB" <<-EOSQL
    CREATE USER simha;
    CREATE DATABASE btgapp;
    GRANT ALL PRIVILEGES ON DATABASE btgapp TO simha;
EOSQL

А потом с Dockerfile вот так:

Dockerfile

FROM postgres:11-alpine
COPY ./init-user-db.sh /docker-entrypoint-initdb.d/init-user-db.sh

(взято из описания postgres на док-хабе )

В заключение - я бы порекомендовал вам не отдавать приоритет дистрибутиву, на котором основано изображение, по сравнению с удобством использования и ремонтопригодностью. Docker позволяет нам запускать приложения в контейнерах, не слишком заботясь о том, что дистрибутив находится внутри контейнера. Это все Linux в любом случае. В конце концов, я ожидаю, что вам нужен стабильный контейнер базы данных postgres, такой как я. Это то, что я получаю с официальным изображением postgres.

Я надеюсь, что помог вам оценить ваши варианты по этому вопросу.

...