Автоматическое создание пространства ключей внутри контейнера докера с помощью 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
Затем необходимо перестроить изображение докера.