这似乎是一个简单的问题,但我并没有找到答案,尽管我搜索了一段时间并且没有成功。
我通过 Docker 运行 Sentry,它使用 Clickhouse。我可以通过以下方式连接到 clickhouse 所在的容器
docker exec -it $(docker ps -aqf 'name=sentry-self-hosted_clickhouse_1') bash
然后我就可以连接到clickhouse-client
那里并执行命令。为了简单起见,我们假设我要运行的命令很简单
SELECT 1 + 2;
我已经测试过它并且它正确返回了 3,正如预期的那样,如附图所示:
现在,我想做的是从 Docker 容器外部运行此脚本并在终端中输出结果(我的实际目标是为 Sentry 创建一个程序化备份系统,Clickhouse 备份也是其中的一部分,但要求这样做太模糊了,所以我决定改为询问我的主要障碍,即从 clickhouse-client 外部执行脚本)。这是我如何从容器外部连接到 Clickhouse 的方法:
当然我也可以直接通过以下方式连接到 Docker 容器clickhouse-client
,例如
docker exec -it $(docker ps -aqf 'name=sentry-self-hosted_clickhouse_1') clickhouse-client -u <myusername> --password <mypassword>
之后就是我的东西了。但是,我想要的是这样的(当然,命令是错误的):
docker exec -it $(docker ps -aqf 'name=sentry-self-hosted_clickhouse_1') clickhouse-client -u <myusername> --password <mypassword> -e "SELECT 1 + 2;"
(这-e
是受到 MySQL 如何允许我像这样内联执行命令的启发)
甚至更好:
cat myinput.sql | docker exec $(docker ps -aqf 'name=sentry-self-hosted_clickhouse_1') clickhouse-client -u <myusername> --password <mypassword> > myoutput.sql
我怎样才能做到这一点?(我寻找过可能的解决方案,但没有太多运气,要么是我遗漏了一些显而易见的东西,要么是没有很好的记录)
要运行作为参数传递的查询:
要运行管道查询:
这些适用于我的 Docker Compose 设置。要使用普通的 Docker 设置运行这些,请执行以下操作:
和
(请注意,我删除了
-t
并且只保留了-i
,请参阅此。)