从 docker-compose 文件在 dockerized Clickhouse 实例中创建数据库和表

creating db and tables in a dockerized Clickhouse instance from docker-compose file

我的要求是在使用 docker-compose 启动时在 Clickhouse 中创建数据库和表。如果是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 实例实现同样的效果吗?

我已经检查过 Clickhouse,我认为默认情况下它不提供相同的功能 Clickhouse dockerfile

您可以通过添加您自己的要求(如执行文件)来自定义 Clickhouse 图像。因此,您所要做的就是使用 Clickhouse 作为自定义图像的基础图像,然后编写一个 bash 脚本,该脚本可用作自定义图像的入口点并使其创建 database/tables 根据您将提供的环境变量,然后让它在最后启动服务。

您可以使用nafigat0r/clickhouse-server:18.12 docker 图片。在 docker-compose.yml 中设置环境变量 DATABASE_NAME 以创建(或使用)特定数据库。您可以选择为特定的 TCP 端口使用设置 DATABASE_PORT

当前图像版本对 SQL 查询有一些限制:每个文件一个。不支持包含多重查询的文件。

我找到了一个不太干净的解决方案。它基本上是将主机目录挂载到容器中,并且 运行 所有 "create tables" 和 "insert" 语句,只要我们不清理挂载的文件夹,就会持久存在!!

clickhouse:
  image: yandex/clickhouse-server:18.10
  ports:
    - "8123:8123"
    - "9000:9000"
  volumes:
   - ./data/clickhouse/data:/var/lib/clickhouse

您可以使用 docker 初始化服务来初始化 Clickhouse。除了 Clickhouse 服务之外,尝试使用将初始化您的数据库

的相同 docker 图像添加服务
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
      "

此 docker 服务将等待 Clickhouse 启动,然后执行您的 init_database.sql 脚本

Add docker-entrypoint-initdb.d support #3695 一样,Clickhouse-server 现在支持服务器 docker 映像中的 运行 初始化脚本。

例如,在 Dockerfile 中:

FROM clickhouse/clickhouse-server 
ADD  ./docker-entrypoint-initdb.d /docker-entrypoint-initdb.d

docker-entrypoint-initdb.d 中添加您的 sql 文件并构建它。

当您从镜像生成容器时,docker-entrypoint-initdb.d中的所有脚本都会运行。

顺便说一句,除了这个问题,我在任何地方都找不到关于它的文档....