从 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
中的所有脚本都会运行。
顺便说一句,除了这个问题,我在任何地方都找不到关于它的文档....
我的要求是在使用 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
中的所有脚本都会运行。
顺便说一句,除了这个问题,我在任何地方都找不到关于它的文档....