2017-12-28 38 views
0

ドッキング・コンテナ内のCassandraデータベースを初期化できません。私はdocker build . -t cassandraを行うと、私はcqlshでエラーが発生しますドッキング・コンテナから実行するとcqlshが失敗する

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

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")}) 

しかし、私はドッカーコンテナの外にそれを行うときに、同じコマンドが正常に動作 は、ここに私のDockerfileです。 接続が拒否されるのはなぜですか?私が間違っている場合、 データベースをどのように初期化できますか?

ご協力いただきありがとうございます。

答えて

1

RUNは、コンテナのビルド時に実行され、コンテナの実行時には実行されません。

カッサンドラを起動するカスタムスクリプトを作成する必要があります(元のコンテナと同じ - CassandraのDockerfileを参照してください)。起動するまで待ってから、cqlshでコマンドを実行します。

+0

Dockerfileは公式のcassandra Dockerfile( 'FROM cassandra'を使用)を使用しているため、コンテナの中にカサンドラがあります。 Dockerfileからcqlshコマンドを削除して起動し、 'docker exec -it cassandraContainer cqlsh'を実行すると、 –

+1

あなたは別のものを混在させています - コンテナをビルドしているときに' RUN'が実行されます - この時点で、このコンテナの内部でカサンドラが実行されていません...あなたのケースでは、カッサンドラはあなたがコンテナを開始するときに実行されていますが、これはコンテナが構築された後にのみ発生します。私の答えの2番目の部分は、正しく実装する方法を示唆しています - これは標準的なパターンです –

+0

私はそれをありがとう、ありがとう。私はそれでカスタムスクリプトを作成しようとします。しかし、独自のパターンを作成するのが標準パターンであれば、公式のDockerfileはなぜ存在しますか?それはちょうどテンプレートとして使用するつもりですか? –

1

cqlshコマンドでは、ホスト名が指定されていない場合、ホスト名としてlocalhost(127.0.0.1)が使用されます。

あなたのケースでは、ホスト名としてlocalhostを使用しています。その理由は、外部から実行して内部のコンテナから実行したときに問題なく動作しているためです。

cqlshにホスト名を渡すと、コンテナ内で実行する際に問題が解決するはずです。

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

しかし、Cassandraとcqlshはどちらもコンテナ内で実行されているため、ローカルホストです。私はあなたが何を意味するのか分からない –

関連する問題