2015-10-23 1 views
16

Я использую docker-compose для развертывания многоконфигурирующего веб-приложения python python. Мне сложно понять, как создавать таблицы в базе данных postgresql во время сборки, поэтому мне не нужно добавлять их вручную с помощью psql.Использование docker-compose для создания таблиц в базе postgresql

Мой докер-compose.yml файл:

web: 
    restart: always 
    build: ./web 
    expose: 
    - "8000" 
    links: 
    - postgres:postgres 
    volumes: 
    - /usr/src/flask-app/static 
    env_file: .env 
    command: /usr/local/bin/gunicorn -w 2 -b :8000 app:app 

nginx: 
    restart: always 
    build: ./nginx/ 
    ports: 
    - "80:80" 
    volumes: 
    - /www/static 
    volumes_from: 
    - web 
    links: 
    - web:web 

data: 
    restart: always 
    image: postgres:latest 
    volumes: 
    - /var/lib/postgresql 
    command: "true" 

postgres: 
    restart: always 
    image: postgres:latest 
    volumes_from: 
    - data 
    ports: 
    - "5432:5432" 

Я не хочу, чтобы ввести Psql для того, чтобы ввести:

CREATE DATABASE my_database; 
CREATE USER this_user WITH PASSWORD 'password'; 
GRANT ALL PRIVILEGES ON DATABASE "my_database" to this_user; 
\i create_tables.sql 

Я оценил бы руководство о том, как создать столы.

ответ

16

Я не хочу, чтобы ввести Psql для того, чтобы напечатать в

Вы можете просто использовать контейнер встроенный инициализации механизма:

COPY init.sql /docker-entrypoint-initdb.d/10-init.sql

Это гарантирует, что ваш sql выполняется после правильной загрузки сервера БД.

Взгляните на свою точку входа script. Он делает некоторые приготовления, чтобы начать psql правильно и смотрит в каталог /docker-entrypoint-initdb.d/ для файлов, заканчивающихся на .sh, .sql и .sql.gz.

10- в имени файла, поскольку файлы обрабатываются в порядке ASCII. Вы можете назвать ваши другие файлы инициализации, например, 20-create-tables.sql и 30-seed-tables.sql.gz, и убедитесь, что они обработаны, как вам нужно.

Также обратите внимание, что команда вызова does not указывает базу данных. Имейте это в виду, если вы, скажем, переходите на docker-compose, и существующие файлы .sql также не указывают DB.

Ваши файлы будут обработаны при первом запуске контейнера, установленном на этапе build.Поскольку Docker Compose останавливает изображения, а затем возобновляет их, практически нет разницы, но если для вас важно начать работу с базой данных на этапе build, я предлагаю использовать встроенный метод init, вызывая /docker-entrypoint.sh из вашего файла docker, а затем очищая его от /docker-entrypoint-initdb.d/. ,

+0

это не работает с последней версией изображения postgres :( – dopatraman

9

Я бы создал таблицы как часть процесса сборки. Создать новый Dockerfile в новом каталоге ./database/

FROM postgres:latest 
COPY . /fixtures 
WORKDIR /fixtures 
RUN /fixtures/setup.sh 

./database/setup.sh будет выглядеть примерно так:

#!/bin/bash 
set -e 

/etc/init.d/postgresql start 
psql -f create_fixtures.sql  
/etc/init.d/postgresql stop 

Поместите создать пользователь, создать базу данных, создать таблицу SQL (и любые другие данные арматуры) в create_fixtures.sql файл в каталоге ./database/.

и, наконец, ваш postgres служба изменится использовать build:

postgres: 
    build: ./database/ 
    ... 

Примечание: Иногда вам нужно sleep 5 (или даже лучше скрипт для опроса и ждать PostgreSQL для начала) после /etc/init.d/postgresql start линии , По моему опыту, скрипт init или клиент psql обрабатывают это для вас, но я знаю, что это не так с mysql, поэтому я думал, что позвоню ему.

+0

Спасибо за помощь. Я столкнулся с этой ошибкой при создании docker-compose.yml. 'bin/sh: 1: /fixtures/setup.sh: Permission denied Не удалось создать службу postgres ': команда'/bin/sh -c /fixtures/setup.sh 'вернула ненулевой код: 126' – blahblahblah

+0

Итак, вы можете добавить 'set -x' в начало скрипта, чтобы он распечатывал каждый шаг, и вы можете выяснить, где он сбой. – dnephin

+0

Я добавил 'RUN chmod + x/fixtures/setup.sh', который разрешил эту проблему. Теперь я получаю 'Нет кластеров PostgreSQL; см. «man pg_createcluster» ... (предупреждение). psql: не удалось подключиться к серверу: нет такого файла или каталога \t Является ли сервер запущенным локально и принимает \t соединений в соке домена Unix «/var/run/postgresql/.s.PGSQL.5432»? Не удалось создать службу postgres ': команда'/bin/sh -c /fixtures/setup.sh 'вернула ненулевой код: 2' – blahblahblah