誰かがデフォルトのキースペースでcassandra docker imageを作成しようとしたかどうか疑問に思っていました。ビルド時に作成しようとしましたが、cassandraはそのフェーズでは実行されていません。これは次のようなものでした。
FROM cassandra:2.0
COPY ../somewhere/keyspace_definition.txt /src/keyspace_definition.txt
RUN /usr/bin/cqlsh -f /src/keyspace_definition.txt
私の新しいアプローチは、エントリポイントスクリプトから実行することですが、他の誰かがより良いアイデアを持っているかどうかを確認したいと思いました。
ハッピーシッピング:D
今日、この問題に取り組みました。ビルドイメージ。デフォルトのCassandra docker-entrypoint.sh
を、exec "$@"
の直前に変更および追加されたもので上書きします。
for f in docker-entrypoint-initdb.d/*; do
case "$f" in
*.sh) echo "$0: running $f"; . "$f" ;;
*.cql) echo "$0: running $f" && until cqlsh -f "$f"; do >&2 echo "Cassandra is unavailable - sleeping"; sleep 2; done & ;;
*) echo "$0: ignoring $f" ;;
esac
echo
done
目的の* .cqlをdocker-entrypoint-initdb.d/
の画像に配置します。
イメージが起動し、cassandraを起動し、成功しない限りデータベースへの挿入を再試行します。スクリプトがIF NOT EXISTS
であることを確認してください。そうでない場合、スクリプトは無期限に実行されます。
@ jan-oudrinckyと@ alexander-morozovからの回答に基づいて、元のdocker-entrypoint.sh
のラッパーを持つ新しいDockerイメージを作成し、環境変数CASSANDRA_KEYSPACE
が設定されているときにキースペースを作成します。開発/テスト環境で役立ちます。
docker-entrypoint.sh
は変更されないため、cassandraベースイメージに変更があったとしても、再構築が必要です。
Dockerfile
FROM cassandra
COPY entrypoint-wrap.sh /entrypoint-wrap.sh
ENTRYPOINT ["/entrypoint-wrap.sh"]
CMD ["cassandra", "-f"]
entrypoint-wrap.sh
#!/bin/bash
if [[ ! -z "$CASSANDRA_KEYSPACE" && $1 = 'cassandra' ]]; then
# Create default keyspace for single node cluster
CQL="CREATE KEYSPACE $CASSANDRA_KEYSPACE WITH REPLICATION = {'class': 'SimpleStrategy', 'replication_factor': 1};"
until echo $CQL | cqlsh; do
echo "cqlsh: Cassandra is unavailable - retry later"
sleep 2
done &
fi
exec /docker-entrypoint.sh "$@"
Spring-Bootdockerコンテナーを使用してcassandraコンテナーにアクセスしています。すべてがdocker-composeによって調整されています。 このチュートリアル 次のコードと組み合わせて機能します私のために。
@Override
protected List<CreateKeyspaceSpecification> getKeyspaceCreations() {
CreateKeyspaceSpecification specification = CreateKeyspaceSpecification.createKeyspace(KEYSPACE);
return Arrays.asList(specification);
}
私はこの決定を使用しました。ファイルから最後の行を削除しました docker-entrypoint.sh そして最後にそれらの行を挿入しました:
exec "$@" > /dev/null &
sleep 30 && echo "CREATE KEYSPACE <YOUR_KEYSAPCE> WITH REPLICATION = {'class': 'SimpleStrategy', 'replication_factor': 1};" | cqlsh > /dev/null && tail -n 10000 -f /var/log/cassandra/system.log
次に、Dockerイメージを再構築する必要があります。
まだ誰もこれに反応していないのは面白いと思います。あなたは彼らが私が想定したコンテナで実行されているMySQLで行ったことに従うことができます。
このリンクを参照してください: http://www.luiselizondo.net/a-tutorial-on-how-to-use-mysql-with-docker/
そのディレクトリに配置したスクリプトはすべて、/ entrypoint.shスクリプトを介して実行されます。 Cassandraのentrypoint.shスクリプトはまだこれをサポートしていないようです。しかしながら!出来た!