Создание базы данных и таблиц в докеризованном экземпляре 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, который может быть использован в качестве точки входа для вашего пользовательского изображения, и заставит его создавать базу данных / таблицы на основе переменной среды, которую вы предоставите, а затем заставит его запустить службу на конец.

Другие вопросы по тегам