Cassandraコンテナの先頭に、キースペースと列ファミリを作成したいと思います。
docker-compose.yml
ファイルで次のことを試しました。
# shortened for clarity
cassandra:
hostname: my-cassandra
image: my/cassandra:latest
command: "cqlsh -f init-database.cql"
画像my/cassandra:latest
には、init-database.cql
に/
が含まれています。しかし、これはうまくいかないようです。
これを実現する方法はありますか?
最近、Cassandraのリファレンスアプリケーションである KillrVideo で同様の問題を解決しようとしました。 Docker Composeを使用して、DataStax Enterprise(Cassandraなど)ノードを含むアプリケーションに必要な環境を起動しています。 CQLスキーマのインストールを初めて開始したときに、そのノードでブートストラップを実行する必要がありました(cqlsh
を使用して、実行しようとしているのと同じように.cql
ファイルでステートメントを実行します)。基本的に、私たちが採用したアプローチは、Dockerエントリポイント用のシェルスクリプトを作成することでした。
cqlsh -f
を使用して、いくつかのCQLステートメントを実行し、スキーマを初期化します。ファイルの存在を使用して、ノードがすでにブートストラップされているかどうかを示し、起動時にそれをチェックして、上記のロジックを実行する必要があるかどうか、または通常どおりに起動できるかどうかを判断します。結果は GitHubのkillrvideo-dse-dockerリポジトリ で確認できます。
このアプローチには1つの注意点があります。これは、リファレンスアプリケーションでは、単一のノードのみをスピンアップしているため(つまり、複数のノードでクラスターを作成していないため)、非常にうまく機能しました。複数のノードを実行している場合は、複数のクライアントがスキーマを作成するために、ノードの1つのみがブートストラップを実行することを確認する必要があります。スキーマを同時に変更すると、クラスターでいくつかの問題が発生する可能性があります。 (これは 既知の問題です そしてうまくいけばいつか修正されるでしょう。)
私もこの質問の解決策を探していました、そしてこれが私がそれを達成した方法です。
ここで、Cassandraの2番目のインスタンスにはschema.cqlのボリュームがあり、CQLSHコマンドを実行します
My Version with healthcheck これで、sleepコマンドを削除できます
version: '2.2'
services:
cassandra:
image: cassandra:3.11.2
container_name: cassandra
ports:
- "9042:9042"
environment:
- "MAX_HEAP_SIZE=256M"
- "HEAP_NEWSIZE=128M"
restart: always
volumes:
- ./out/cassandra_data:/var/lib/cassandra
healthcheck:
test: ["CMD", "cqlsh", "-u cassandra", "-p cassandra" ,"-e describe keyspaces"]
interval: 15s
timeout: 10s
retries: 10
cassandra-load-keyspace:
container_name: cassandra-load-keyspace
image: cassandra:3.11.2
depends_on:
cassandra:
condition: service_healthy
volumes:
- ./src/main/resources/cassandra_schema.cql:/schema.cql
command: /bin/bash -c "echo loading cassandra keyspace && cqlsh cassandra -f /schema.cql"
NetFlixバージョンsleep
version: '3.5'
services:
cassandra:
image: cassandra:latest
container_name: cassandra
ports:
- "9042:9042"
environment:
- "MAX_HEAP_SIZE=256M"
- "HEAP_NEWSIZE=128M"
restart: always
volumes:
- ./out/cassandra_data:/var/lib/cassandra
cassandra-load-keyspace:
container_name: cassandra-load-keyspace
image: cassandra:latest
depends_on:
- cassandra
volumes:
- ./src/main/resources/cassandra_schema.cql:/schema.cql
command: /bin/bash -c "sleep 60 && echo loading cassandra keyspace && cqlsh cassandra -f /schema.cql"
P.S私はこの方法を Netflix Repos の1つで見つけました