Создание базы данных и таблиц в докеризованном экземпляре Clickhouse из файла docker-compose
Мое требование - создавать БД и Таблицы в Clickhouse, когда я поднимаю их с помощью docker-compose. Если это MySQL, я делаю это, как показано ниже:
mysql_1:
image: mysql:5.7.16
environment:
MYSQL_DATABASE: "one"
MYSQL_USER: "one_user"
MYSQL_PASSWORD: "one_user_pass"
MYSQL_ROOT_PASSWORD: "root"
MYSQL_ALLOW_EMPTY_PASSWORD: "yes"
volumes:
- ./data/one:/docker-entrypoint-initdb.d
ports:
- "3306:3306"
Есть ли способ добиться того же для экземпляра Clickhouse?
5 ответов
Я нашел не очень чистое решение для этого. Это в основном монтирование директории хоста в контейнер и выполнение всех операторов "создания таблиц" и "вставки", которые будут сохраняться до тех пор, пока мы не очистим смонтированную папку!!
clickhouse:
image: yandex/clickhouse-server:18.10
ports:
- "8123:8123"
- "9000:9000"
volumes:
- ./data/clickhouse/data:/var/lib/clickhouse
Поскольку добавлена поддержка docker-entrypoint-initdb.d #3695, Clickhouse-server теперь поддерживает запуск сценариев инициализации в образе докера сервера.
например, в Dockerfile:
FROM clickhouse/clickhouse-server
ADD ./docker-entrypoint-initdb.d /docker-entrypoint-initdb.d
добавьте свои файлы sql и создайте их.
при генерации контейнера из образа весь скрипт в
docker-entrypoint-initdb.d
будет работать.
Кстати, я нигде не могу найти по нему документ, кроме вопроса....
Вы можете использовать службу инициализации docker для инициализации Clickhouse. Помимо службы Clickhouse попробуйте добавить службу с использованием того же образа докера, который будет инициализировать вашу базу данных.
clickhouse-init:
image: yandex/clickhouse-server
volumes:
- ./clickhouse:/var/clickhouse
depends_on:
- clickhouse
networks:
- ch_ntw
entrypoint: [ '/bin/sh', '-c' ]
command: |
"
while ! clickhouse-client --host clickhouse --user your-user --password your-password -q \"SHOW databases;\"; do
echo waiting for clickhouse up
sleep 1
done
clickhouse-client --host clickhouse --user your-user --password your-password --queries-file /var/clickhouse/schema/init_database.sql
tail -f /dev/null
"
Этот сервис докеров будет ждать запуска Clickhouse, а затем выполнит ваш
init_database.sql
сценарии
Вы можете использовать nafigat0r/clickhouse-server:18.12 образ докера. В docker-compose.yml
установить переменную среды DATABASE_NAME
для создания (или использования) конкретной базы данных. При желании вы можете установить DATABASE_PORT
для конкретного использования порта TCP.
Текущая версия изображения имеет некоторые ограничения для запросов SQL: по одному на файл. Файлы с несколькими запросами не поддерживаются.
Я проверил Clickhouse
и я не думаю, что он обеспечивает те же функции по умолчанию Dockerfile Clickhouse.
Вы можете настроить Clickhouse
изображения, добавив свои собственные требования, такие как выполнение файлов. Так что все, что вам нужно сделать, это использовать Clickhouse
в качестве базового изображения для вашего пользовательского изображения, то, возможно, написание сценария bash, который может быть использован в качестве точки входа для вашего пользовательского изображения, и заставит его создавать базу данных / таблицы на основе переменной среды, которую вы предоставите, а затем заставит его запустить службу на конец.