1.抛出问题
我们有两个docker应用,一个是业务应用,docker名称为:cloud_patrol;一个是clickhouse应用,docker名称为clickhouse,业务应用会产生数据,这数据会输出为csv文件,我们需要将这csv文件导入到clickhouse数据库中。
2.解决方案
如果在clickhouse容器中,那么导入csv文件很简单
clickhouse-client --user=guandata --password=123456 --query="insert into tableA FORMAT CSV"< /opt/tableA.csv
/opt/tableA.csv为clickhouse容器中的目录地址
但是该业务需要在应用的容器中调用clickhouse-client导入csv,但是该容器没有clickhouse-client,所以不能直接调用,但是有两种方法可以在该容器中调用。
方案1:
进入clickhouse容器
clickhouse-client其实只是软连接,真实的可执行文件是/usr/bin/clickhouse,所以可以将这个文件与应用目录进行挂载,这样应用就可以直接调用clickhouse-client。
使用clickhouse调用的方式是:
/usr/bin/clickhouse client --host=127.0.0.1 --port=9000 --user=guandata --password=123456 --query="insert into tableA FORMAT CSV"< /opt/tableA.csv
注意:端口不能为8123,默认是9000,这里的/opt/tableA.csv目录地址为应用的docker容器中的目录,不是clickhouse容器的地址。
方案2:
参考文章:
https://blog.csdn.net/u010797364/article/details/121912358
通过对应用容器进行docker挂载,这样在应用cloud_patrol容器就可以调用clickhouse容器的clickhouse-client。
-v /var/run/docker.sock:/var/run/docker.sock -v /usr/bin/docker:/usr/bin/docker
在应用cloud_patrol容器可以直接调用
docker exec -i clickhouse clickhouse-client --user=guandata --password=123456 --query="insert into tableA FORMAT CSV"< /opt/tableA.csv
/opt/tableA.csv为cloud_patrol目录中的文件地址。