web-dev-qa-db-ja.com

cassandra)を使用してDockerコンテナ内にキースペースを自動的に作成します

誰かがデフォルトのキースペースで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

14
jossemarGT

今日、この問題に取り組みました。ビルドイメージ。デフォルトの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であることを確認してください。そうでない場合、スクリプトは無期限に実行されます。

7
Jan Oudrnicky

@ 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 "$@"
11
aleung

Spring-Bootdockerコンテナーを使用してcassandraコンテナーにアクセスしています。すべてがdocker-composeによって調整されています。 このチュートリアル 次のコードと組み合わせて機能します私のために。

@Override
protected List<CreateKeyspaceSpecification> getKeyspaceCreations() {
    CreateKeyspaceSpecification specification = CreateKeyspaceSpecification.createKeyspace(KEYSPACE);

    return Arrays.asList(specification);
}
1
NotMyFaultSir

私はこの決定を使用しました。ファイルから最後の行を削除しました 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イメージを再構築する必要があります。

0

まだ誰もこれに反応していないのは面白いと思います。あなたは彼らが私が想定したコンテナで実行されているMySQLで行ったことに従うことができます。

このリンクを参照してください: http://www.luiselizondo.net/a-tutorial-on-how-to-use-mysql-with-docker/

そのディレクトリに配置したスクリプトはすべて、/ entrypoint.shスクリプトを介して実行されます。 Cassandraのentrypoint.shスクリプトはまだこれをサポートしていないようです。しかしながら!出来た!

0
Rory Savage