Автоматическое создание пространства ключей внутри контейнера докера с помощью cassandra

Мне было интересно, попытался ли кто-нибудь создать изображение докеры cassandra с помощью ключевого пространства по умолчанию, я пытался это сделать по времени BUILD, но это не работает, потому что cassandra не работает на этой стадии. Это было похоже на это:

FROM cassandra:2.0
COPY ../somewhere/keyspace_definition.txt /src/keyspace_definition.txt
RUN /usr/bin/cqlsh -f /src/keyspace_definition.txt

Мой новый подход будет делать это с точки входа script, но я хотел бы сейчас, если у кого-то есть лучшая идея.

Счастливая доставка: D

Ответ 1

Схватил эту проблему сегодня. Создайте образ, который перезаписывает по умолчанию Cassandra docker-entrypoint.sh с одним измененным, добавленным, прямо перед exec "[email protected]"

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 в противном случае script будет работать бесконечно.

Ответ 2

Основываясь на ответах @jan-oudrincky и @alexander-morozov, я создаю новое изображение докеров, у которого есть обертка исходного docker-entrypoint.sh, чтобы создать пространство ключей, когда установлена ​​переменная среды CASSANDRA_KEYSPACE. Он будет полезен в среде dev/test.

Он не изменяет 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 "[email protected]"

Ответ 3

Мне интересно, что никто еще не ответил на это. Вы можете следить за тем, как они работали с MySQL, работающими в контейнере, который я предполагал.

Обратитесь к этой ссылке: http://www.luiselizondo.net/a-tutorial-on-how-to-use-mysql-with-docker/

Любой script, который вы помещаете в этот каталог, будет выполняться через /entrypoint.sh script. Похоже, Cassandra entrypoint.sh script пока не поддерживает. Однако! Это возможно!

Ответ 4

Я использовал эти решения. Я удалил последнюю строку из файла docker-entrypoint.sh и вставил в конце строки:

exec "[email protected]" > /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

Затем необходимо перестроить изображение докера.