这似乎是一个简单的问题,但我没有找到答案,尽管搜索了一段时间并且我的尝试没有成功。
我通过 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 的方法:
当然我也可以直接通过
clickhouse-client
连接到Docker容器,就像
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 exec clickhouse clickhouse-client -q 'select 1 + 2'
┌─plus(1, 2)─┐
1. │ 3 │
└────────────┘
运行通过管道输入的查询:
$ echo 'select 1 + 2' | docker compose exec -T clickhouse clickhouse-client
3
这些适用于我的 Docker Compose 设置。要使用普通的 Docker 设置来运行这些,以下内容应该可以工作:
$ docker exec -it $(docker ps -aqf 'name=sentry-self-hosted_clickhouse_1') clickhouse-client -u <myusername> --password <mypassword> -q 'select 1 + 2'
和
$ echo 'select 1 + 2' | docker exec $(docker ps -aqf 'name=sentry-self-hosted_clickhouse_1') clickhouse-client -u <myusername> --password <mypassword>
(注意我删除了
-it
,这与用 -T
传递 docker compose exec
相同,请参阅 this。)