2015-08-27 17 views
10

Zastanawiam się, czy ktoś próbował zbudować obraz dokera cassandra z domyślnym keyspace, próbowałem zrobić to w czasie BUILD, ale to nie działa, ponieważ kasandra nie działa w tej fazie. To było coś podobnego do tego:Twórz przestrzeń kluczy automatycznie wewnątrz kontenera dokera z kassandra

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

Moje nowe podejście będzie to zrobić ze skryptu punkt_wejścia, ale chciałem teraz jeśli ktoś ma lepszy pomysł.

Szczęśliwy wysyłki: D

+0

skończyło się skopiowanie skryptu migracji na etapie budowania i uruchomienie go jako część CMD, jak to 'CMD migration.sh && cassandra -f', tak jak ten skrypt migracji działa jako zadanie w tle i odczekaj arbitralny czas, aż kassandra się uruchomi. – jossemarGT

Odpowiedz

6

Rozwiązał ten problem już dziś. Budowanie wizerunku, który nadpisuje domyślne Cassandrę docker-entrypoint.sh ze zmodyfikowanej, dołączane, tuż przed 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 

Umieścić żądaną * .cql w obrazie w docker-entrypoint-initdb.d/.

Obraz zostanie uruchomiony, uruchom się na pulpicie i ponowi próbę wstawienia do bazy danych, chyba że się powiedzie. Po prostu upewnij się, że twoje skrypty są IF NOT EXISTS inaczej skrypt będzie działał przez czas nieokreślony.

+0

To sprytne rozwiązanie! Chciałbym dodać, że kilka miesięcy po tym, jak opublikowałem to pytanie, znalazłem inny sposób, aby to zrobić, uruchamiając bazę danych w czasie kompilacji, po której następuje długi czas snu, a następnie uruchamiałem migracje i ostatecznie zatrzymałem bazę danych na końcu. – jossemarGT

1

Uważam to ciekawe, że nikt nie odpowiedział na to jeszcze. Możesz śledzić, że zrobili z MySQL działającym w kontenerze, który przypuszczałem.

zobacz ten link: http://www.luiselizondo.net/a-tutorial-on-how-to-use-mysql-with-docker/

Każdy skrypt można umieścić w tym katalogu będą wykonywane przez skrypt /entrypoint.sh. Wygląda na to, że skrypt entrypoint. Cassandra jeszcze tego nie obsługuje. Jednak! To mogło!

0

Użyłem tych decyzji. Usunąłem ostatnią linię z pliku docker-entrypoint.sh i włożona w końcu te linie:

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 

Następnie konieczne jest odbudowanie Döcker obraz.

2

Bazując na odpowiedziach od @ jan-oudrincky i @ alexander-morozov, buduję nowy obraz doka, który ma opakowanie oryginalnego docker-entrypoint.sh, aby utworzyć przestrzeń kluczy, gdy ustawiona jest zmienna środowiskowa CASSANDRA_KEYSPACE. Będzie to przydatne w środowisku dev/test.

Nie modyfikuje ona docker-entrypoint.sh, więc nawet jeśli obraz podstawowy kassandra ma jakąkolwiek modyfikację, wystarczy przebudować.

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]" 
Powiązane problemy