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



我的要求是当我使用 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:
image: yandex/clickhouse-server:18.10
ports:
- "8123:8123"
- "9000:9000"
volumes:
- ./data/clickhouse/data:/var/lib/clickhouse

由于 Add docker-entrypoint-initdb.d 支持 #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中的所有脚本都将运行。

顺便说一句,除了问题之外,我在任何地方都找不到文档......

您可以使用 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脚本

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

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

您可以使用 nafigat0r/clickhouse-server:18.12 docker 镜像。docker-compose.yml设置用于创建(或使用(特定数据库的环境变量DATABASE_NAME。(可选(您可以为特定的 TCP 端口使用情况设置DATABASE_PORT

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

最新更新