2015-08-01 10 views
5

Sto provando a creare un Dockerfile per una webapp che utilizza un database basato su file. Mi piacerebbe essere in grado di montare il file dall'host * Il file è nella radice dell'installazione completa del software, quindi non è davvero l'ideale per montare la directory completa.Come posso montare un file in un contenitore, che non è disponibile prima della prima esecuzione?

Un altro problema è che prima del primo utilizzo, il file di database non è ancora stato creato. Un utente per la prima volta non avrà un database, ma potrebbe farlo un altro utente. Non posso "montare" nulla durante una costruzione ** Credo.

Probabilmente potrebbe funzionare in questo modo:

  • First/nuovo inizio database:
    • Avviare il contenitore (senza mount).
    • La webapp crea un database.
    • arresto del contenitore
  • partenze successive:
    • Avviare il contenitore con una -v per montare il file

Sarebbe meglio se questo inizio extra/fermare isn 'necessario per un utente. Anche se lo è, sto ancora cercando un modo per farlo in modo facile, possibilmente con 2 'metodi' di avviarlo (forse posso definire una cosa di primo avvio nella docker-compose così come un metodo 'normale'?).

Come posso farlo in modo semplicissimo, in modo che sia chiaro per gli utenti la prima volta?

* Il motivo è che è possibile copiare il Dockerfile e il file di database come backup e essere attivi con solo questi 2 elementi.

** How to mount host volumes into docker containers in Dockerfile during build

+2

Riguardo al voto di chiusura: Docker è uno strumento di programmazione legittimo? Non sto provando a montare un disco fisso o ad usare del software, sto cercando di creare un buon Dockerfile in modo da poter distribuire il software. Mi sembra onesto? – Nanne

+0

È possibile specificare il percorso del file DB?Se è così, puoi montare una dir che contiene o conterrà il file DB e (1) se il file esiste, la webapp lo userà, o (2) se il file non esiste, la webapp (all'interno del contenitore) lo creerà e sarà disponibile per le prossime esecuzioni. Ha senso? –

+0

buon punto, l'ho provato e non ha funzionato, ho dimenticato di aggiungere, mi dispiace. Il file db si trova nella radice del percorso di installazione del software. Modificherò la domanda :) – Nanne

risposta

1

Un approccio che può funzionare è:

  • avviare il database nel file di compilazione in modo che abbia il tempo di creare il file di default prima di uscire.
  • Dichiarare un VOLUME nel file Docker per il file dopo le istruzioni precedenti. Ciò causerà la copia del file nel volume all'avvio di un contenitore, presupponendo che non si fornisca esplicitamente un percorso host
  • Utilizzare contenitori di dati anziché volumi. Quindi l'utilizzo normale sarebbe:

    docker run --name data_con my_db echo "my_db data container" 
    docker run -d --volumes-from data_con my_db 
    ... 
    

Il primo contenitore deve uscire immediatamente ma impostare il volume che viene utilizzata nel secondo contenitore.

+0

Hmm, grazie! Penso di vedere, sembra ragionevole! Dovrei capire per quanto posso copiare/eseguire il backup del file dal contenitore, ma dovrebbe essere possibile .. – Nanne

+1

@Nanne per i backup è possibile utilizzare questo strumento specifico finché si esegue Docker su un host reale (quindi non in boot2docker): https : //github.com/discordianfish/docker-backup – Henk

+0

non funziona 'docker cp' per i backup? –

Problemi correlati