2015-08-27 6 views
10

Ich frage mich, wenn jemand versucht hat, ein Cassandra Docker Bild mit Standard-Schlüsselraum zu bauen, habe ich versucht, es zu BUILD Zeit tun, aber es funktioniert nicht, weil Cassandra nicht läuft diese Phase. Es war so etwas wie folgt aus:Create Schlüsselbereich automatisch in Docker Container mit Cassandra

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

Mein neuer Ansatz wird es vom Einstiegspunkt Skript zu tun, aber, ich wollte jetzt, wenn jemand anderes eine bessere Idee hat.

Glücklicher Versand: D

+0

ich ein Migrationsscript auf BUILD Phase Kopieren beendet und es als Teil des CMD, wie dieser 'CMD migration.sh läuft && cassandra -f, übrigens läuft dieses Migrations-Skript als Hintergrund-Task und wartet eine beliebige Zeit bis Cassandra startet. – jossemarGT

Antwort

6

Dieses Problem heute angepackt. Baue Bild, das Standard Cassandra docker-entrypoint.sh mit einem überschreibt modifiziert, die angehängten, direkt vor 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 

Setzen Sie die gewünschte * .cql in Bild in docker-entrypoint-initdb.d/.

Das Image wird gestartet, startet die Cassandra und versucht erneut, es in die Datenbank einzufügen, es sei denn, es ist erfolgreich. Stellen Sie nur sicher, dass Ihre Skripte IF NOT EXISTS sind, ansonsten läuft das Skript auf unbestimmte Zeit.

+0

Das ist eine clevere Lösung! Ich möchte hinzufügen, dass ich Monate nachdem ich diese Frage gepostet habe, einen anderen Weg gefunden habe, indem ich die Datenbank zur Build-Zeit starte, gefolgt von einer riesigen Ruhezeit, dann die Migrationen danach abhalte und schließlich die Datenbank am Ende stoppe. – jossemarGT

1

Ich finde es interessant, dass noch niemand darauf reagiert. Sie können verfolgen, dass sie mit MySQL in einem Container ausgeführt haben, die ich vermutete.

Siehe diesen Link: http://www.luiselizondo.net/a-tutorial-on-how-to-use-mysql-with-docker/

Jedes Skript Sie in diesem Verzeichnis abgelegt wird durch das /entrypoint.sh Skript ausgeführt werden. Sieht so aus, als ob das Script entrypoint.sh von Cassandra dies noch nicht unterstützt. Jedoch! Es könnte!

0

Ich habe diese Entscheidungen verwendet. Ich löschte letzte Zeile aus der Datei docker-entrypoint.sh und am Ende diese Zeilen eingefügt:

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 

Dann ist es notwendig, Docker Bild neu zu erstellen.

2

Basis auf Antworten von @ Jan-Oudrincky und @ Alexander-Morozov, ich baue ein neues Docker-Bild, das einen Wrapper von Original docker-entrypoint.sh hat, um Schlüsselraum zu erstellen, wenn die Umgebungsvariable CASSANDRA_KEYSPACE gesetzt ist. Es wird in der Entwicklungs-/Testumgebung nützlich sein.

Es ändert sich nicht docker-entrypoint.sh so auch wenn cassandra base image eine Änderung hat, brauchen Sie nur eine Neuerstellung.

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]" 
Verwandte Themen