2016-01-20 5 views
5

Vorrei creare una finestra mobile che costruisca un'immagine di Cassandra con uno spazio delle chiavi e uno schema già lì all'avvio dell'immagine.Come creare un Dockerfile per cassandra (o qualsiasi database) che include uno schema?

In generale, come si crea un Dockerfile che costruisce un'immagine che include alcuni passaggi che non possono essere eseguiti fino a quando il contenitore è in esecuzione, almeno la prima volta?

In questo momento, ho due fasi: costruire l'immagine cassandra da una cassandra esistente Dockerfile che associa un volume con i file di schema CQL in una directory temporanea, e quindi eseguire finestra mobile exec con cqlsh per importare lo schema dopo l'immagine ha stato avviato come contenitore.

Ma ciò non crea un'immagine con lo schema: solo un contenitore. Quel contenitore potrebbe essere salvato come immagine, ma è ingombrante.

docker run --name $CASSANDRA_NAME -d \ 
     -h $CASSANDRA_NAME \ 
     -v $CASSANDRA_DATA_DIR:/data \ 
     -v $CASSANDRA_DIR/target:/tmp/schema \ 
     tobert/cassandra:2.1.7 

poi

docker exec $CASSANDRA_NAME cqlsh -f /tmp/schema/create_keyspace.cql 
docker exec $CASSANDRA_NAME cqlsh -f /tmp/schema/schema01.cql 
# etc 

questo funziona, ma rende impossibile l'utilizzo con strumenti come Docker comporre in quanto contenitori/servizi legati inizieranno troppo e si aspettano lo schema di essere a posto.

Ho visto un tentativo in cui il processo di cassandra come tentato di essere avviato in background nel Dockerfile durante la compilazione, quindi eseguire cqlsh, ma non penso che abbia funzionato troppo bene.

+0

Qual è il problema nel fare ciò che si fa, il 'docker run', il 2' docker exec' e poi un 'docker commit' e si ha l'immagine che si desidera? Non un processo in un'unica fase? – user2915097

+0

@ user2915097 Mi piacerebbe usare la finestra mobile comporre per creare un cluster di dire un'app e un database. Docker compose crea solo le immagini e le avvia. L'app genererebbe errori in quanto prevedrebbe che il database abbia uno schema. Suppongo che potrei lasciargli generare errori ed eseguire exec docker al termine della composizione, ma non è molto pulito. –

+0

qual è il problema nel fare nel tuo Dockerfile il tuo 'cqlsh -f/tmp/schema/create_keyspace.cql' e l'altro comando? – user2915097

risposta

3

Ok ho avuto questo problema e qualcuno mi ha consigliato una certa strategia per affrontare:

  1. partire da una Cassandra Dockerfile esistente, quello ufficiale per esempio
  2. Rimuovere la roba EntryPoint
  3. copia dello schema (.cql) di file e di dati (.csv) nell'immagine e metterlo da qualche parte,/opt/dati ad esempio
  4. creare uno script di shell che verrà utilizzato come l'ultimo comando per avviare Cassandra

    a. avviare cassandra con $ CASSANDRA_HOME/bin/cassandra

    b. Se c'è una cartella $ CASSANDRA_HOME/data/data/your_keyspace-xxxx e non è vuota, non fare nulla di più

    c. Else

    1. sleep some time to allow the server to listen on port 9042 
    2. when port 9042 is listening, execute the .cql script to load csv files 
    

Ho trovato questa procedura piuttosto ingombrante, ma sembra che ci sia nessun altro modo intorno. Per il laboratorio pratico di Cassandra, ho trovato più facile creare un'immagine VM usando Vagrant e Ansible.

+2

Ciao, sembra esattamente quello di cui ho bisogno! Ma puoi fornire un esempio del Dockerfile e dello script della shell? – Belgikoi

+0

Sì, un esempio di cui sopra sarebbe molto utile! –