2014-11-20 11 views
7

In realtà sto cercando di ottenere qualcosa con Docker ma sono bloccato, c'è il mio problema.EC2 con il Docker e il volume EBS, montare il volume EBS all'interno del contenitore durante l'init

Ho il mio contenitore ospitato su EC2 con la mia app web al suo interno. La mia webapp usa come database un repository JCR che è fondamentalmente un file memorizzato dove vuoi. Quindi, ogni volta che inizia la mia app Web, se il repository non esiste, lo crea altrimenti utilizza l'esistente.

La mia finestra mobile attuale assomiglia a questo https://gist.github.com/agonist/7cab7358379e9dd6e812 ./chameleon.sh start appena inizia la mia webapp. In questa app, ho configurato dove si trova il file del repository.

Ora ho creato un volume EBS collegato e montato nella mia istanza EC2. Questo volume sarà dedicato alla memorizzazione del repository. Quindi basicamente nella mia app configuro il mio percorso di repository su /mnt/repository/ dove repository è la directory che conterrà il mio file di repository creato dalla mia app web. Ma non so come posso montare questo volume nel mio contenitore prima del ./chameleon.sh start nel Dockefile. Come vedo durante la mia ricerca

docker run -v /mnt/repository:/mnt/repository aws_beanstalk/current-app 

non è eseguibile dal Dockefile.

Ho anche trovato cose su dati solo contenitore che condividono un volume con un altro contenitore, ma sempre la stessa probleme se devo correre

sudo docker run -d --volumes-from dbdata 

dopo il mio contenitore iniziato

+0

so/mnt/repository è un * file * ** e ** il punto di montaggio? O è il mountpoint/mnt? e solo per essere sicuri: si esegue client docker sulla stessa istanza, non sul computer locale con DOCKER_HOST remoto? – creack

+0

Ho aggiornato l'argomento per essere più chiaro./mnt/repository/è la directory in cui l'app salverà il file del repository. E sì, lavoro solo sulla mia istanza EC2 sul mio computer locale. –

risposta

4

Versione corta: Questo è non una risposta, solo un piccolo aiuto per chiarire come funziona Docker.

non direttamente collegate, ma il vostro Dockerfile dovrebbe probabilmente simile a questa:

FROM dockerfile/java:oracle-java8 

# Expose the port 9000 
EXPOSE 9000 

# Volumes 
VOLUME /root/wisdom/logs 
VOLUME /root/wisdom/application 

# Change workdir. 
WORKDIR /root/wisdom 

RUN touch /root/wisdom.log 

# Add the wisdom distribution 
ADD . /root/wisdom 

# For easier handling, we dump the log, so `docker logs containerId` displays 
# the log. 
CMD ./chameleon.sh start && tail -F logs/wisdom.log 

In questo modo, tutti i livelli prima di ADD vengono memorizzati nella cache. Mentre prima, se cambi qualcosa nella tua directory, tutti i layer sono ricreati. È chameleon.sh che deve essere chmod nella directory locale, non in fase di runtime. ADD conserva le autorizzazioni. il stop non è necessario come quando si avvia il contenitore, non è in esecuzione alcun processo.

Il -v non è in effetti eseguibile da un Dockerfile. Questo è previsto poiché Dockerfile è pensato per essere portabile. Se lo leghi al tuo computer locale, perdi questa funzione.

Quando si esegue il docker run -v /mnt/repository:/mnt/repository aws_beanstalk/current-app, il supporto viene eseguito prima del in esecuzione del comando. È possibile ricontrollare eseguendo docker run -v /mnt/repository:/mnt/repository aws_beanstalk/current-app mount

Quando si utilizza --volumes-from, è la stessa cosa. I volumi vengono montati prima del che esegue il comando.

Perché allora non funziona? Non sono sicuro, sarebbe interessante esaminare il risultato mount e fare alcuni test manuali con l'EBS. Ho alcuni contenitori che montano volumi EBS e funziona perfettamente.