【问题标题】:cqlsh is failing when executed from docker container从 docker 容器执行时 cqlsh 失败
【发布时间】:2018-06-09 06:19:39
【问题描述】:

我在 docker 容器中初始化 Cassandra 数据库时遇到问题。 这是我的 Dockerfile:

FROM cassandra
COPY ./createTable.cql /tmp/createTable.cql
RUN cqlsh -f /tmp/createTable.cql

当我执行docker build . -t cassandra 时,cqlsh 出现错误:

Connection error: ('Unable to connect to any servers', {'127.0.0.1': error(111, "Tried connecting to [('127.0.0.1', 9042)]. Last error: Connection refused")})

但是,当我在 Docker 容器之外执行此操作时,相同的命令可以正常工作。 为什么连接被拒绝?如果我做错了,我该如何初始化我的 数据库?

感谢您的任何帮助或建议。

【问题讨论】:

    标签: docker cassandra connection dockerfile cqlsh


    【解决方案1】:

    RUN 在构建容器时执行,而不是在容器执行时执行。

    您需要编写将启动 Cassandra 的自定义脚本(与原始容器中相同 - 查看 Cassandra 的 Dockerfile),然后等到它启动,然后再通过 cqlsh 执行命令。

    【讨论】:

    • 由于 Dockerfile 使用的是官方的 cassandra Dockerfile(FROM cassandra 行),因此容器内部运行着一个 Cassandra。如果我从 Dockerfile 中删除 cqlsh 命令,启动它然后运行docker exec -it cassandraContainer cqlsh,它可以工作
    • 你混合了不同的东西——RUN 在你构建容器时被执行(我已经用它更新了答案)——此时没有 Cassandra 在里面运行容器...在您的情况下,正如您所描述的,Cassandra 在您启动容器时正在运行,但这仅在构建容器后发生。我的回答的第二部分建议如何正确实现它 - 这是一个标准模式
    • 好的,我知道了,谢谢。我会尝试用它创建一个自定义脚本。但是,如果标准模式是创建您自己的 Dockerfile,为什么还要有官方的 Dockerfile 呢?它只是用作模板吗?
    • 标准 Dockerfile 可以单独使用,也可以作为模板使用——但需要正确扩展
    • 我试过这样做,但我卡住了。我检查(使用nc -z localhost port)在运行cqlsh 之前打开了Cassandra 端口,但是在Cassandra 准备好之前打开了端口,因此cqlsh 崩溃。你如何等待 Cassandra 启动?
    【解决方案2】:

    cqlsh 命令需要运行 Cassandra 的主机名,如果未提供主机名,它将以 localhost (127.0.0.1) 作为主机名。

    在您的情况下,它以 localhost 作为主机名,看起来您的 Cassandra 在容器外部运行,因此当您从外部运行并从容器内部失败时,它工作正常。

    将主机名传递给 cqlsh 应该可以解决您在容器中运行它时的问题。

    cqlsh <hostname or ip> -f /tmp/createTable.cql
    

    【讨论】:

    • 但是 Cassandra 和 cqlsh 都是在容器中运行的,所以是 localhost。我不明白你的意思,sry
    猜你喜欢
    • 1970-01-01
    • 2021-06-03
    • 2018-02-10
    • 2020-07-15
    • 1970-01-01
    • 2021-06-08
    • 2020-10-03
    • 1970-01-01
    • 2019-03-25
    相关资源
    最近更新 更多