Контейнер - это сервер базы данных. Как попросить Dockerfile завершить создание после запуска этого контейнера? - PullRequest
0 голосов
/ 09 апреля 2020

Я использую изображение postgis/postgis Docker для установки сервера базы данных для моего приложения.

  1. На сервере базы данных должно быть создано табличное пространство, затем база данных.
  2. Затем каждый раз, когда другое приложение запускается из другого контейнера, оно запускает сценарий Liquibase, который будет обновлять схему базы данных (создавать таблицы, индекс ...) при необходимости.

На терминале , чтобы подготовить контейнер базы данных, я выполняю следующие команды:

# Run a naked Postgis container
sudo docker run --name ecoemploi-postgis 
     -e POSTGRES_PASSWORD=postgres 
     -d -v /data/comptes-france:/data/comptes-france postgis/postgis

# Send 'bash level' commands to create the directory for the tablespace
sudo docker exec -it ecoemploi-postgis 
     bin/sh -c 'mkdir /tablespace && chown postgres:postgres /tablespace'

Затем, чтобы завершить мой шаг 1, мне нужно выполнить операторы SQL, чтобы создать табличное пространство с точки зрения PostGIS и создаю базу данных с помощью CREATE DATABASE.

Я подключаюсь вручную, под psql моего контейнера:

sudo docker exec -it ecoemploi-postgis bin/sh 
     -c 'exec psql -h "$POSTGRES_PORT_5432_TCP_ADDR" 
     -p "$POSTGRES_PORT_5432_TCP_PORT" -U postgres'

И запускаю вручную эти команды:

CREATE TABLESPACE data LOCATION '/tablespace';
CREATE DATABASE comptesfrance TABLESPACE data;
exit

Но я бы хотел создать контейнер из одного Dockerfile, сделав всю необходимую работу. Сложность состоит в том, что это должно быть сделано в двух частях:

  1. Одна до запуска контейнера. (создание каталогов, предоставление им user: group).
  2. Один после того, как он запускается впервые: объявление табличного пространства и создание базы. Если я хорошо понимаю базовый образ, который я сделал, это следует сделать после запуска точки входа docker-entrypoint.sh?

Каков хороший способ написать Dockerfile, создав контейнер, выполнив все эти шаги?

Ответы [ 2 ]

1 голос
/ 09 апреля 2020

Образ PostGIS"основан на официальном postgres изображении", поэтому он должен иметь возможность использовать механизм /docker-entrypoint-initdb.d. Все файлы, которые вы помещаете в этот каталог, будут запускаться при первом запуске контейнера базы данных. Dockerfile postgis уже использует этот каталог для установки расширений PostGIS в базу данных по умолчанию.

Это означает, что вы можете поместить свои настройки времени сборки непосредственно в Dockerfile и скопировать загрузочный файл. в этот каталог.

FROM postgis/postgis:12-3.0
RUN mkdir /tablespace && chown postgres:postgres /tablespace
COPY createdb.sql /docker-entrypoint-initdb.d/20-createdb.sql
# Use default ENTRYPOINT/CMD from base image

Для описываемой вами конкретной установки это может не потребоваться. Каждая база данных работает в изолированном пространстве файловой системы и начинается с пустого каталога данных, поэтому нет необходимости указывать c альтернативный каталог данных; Стиль Docker состоит в том, чтобы просто запустить несколько баз данных, если вам нужно изолированное хранилище. Аналогично, базовый postgres образ создаст для вас базу данных при первом запуске (названную переменной среды POSTGRES_DB).

0 голосов
/ 09 апреля 2020

Чтобы запустить контейнер, ваш Dockerfile должен быть работоспособным и заполненным. вы должны ввести запросы в файл bash, а в последней строке вы должны ввести ENTRYPOINT с этим bash script

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