2015-02-19 37 views
5

Sto utilizzando i dockerfile per creare un contenitore semplice. Ecco l'Dockerfile:Come eseguire uno script di shell utilizzando file docker CMD

FROM XXXXXXX:5003/base-java 

MAINTAINER XXXXX 

ADD pubsub/ /opt/pubsub/ 

CMD ["/opt/pubsub/run.sh"] 

Contenuto run.sh è la seguente:

#!/bin/bash 
nohup java -jar /opt/pubsub/publish.jar & 
nohup java -jar /opt/pubsub/subscribe.jar & 

Questo è semplice applicazione java per pub/sub.

Ora ho un altro contenitore che esegue rabbitmq e sto collegando i 2 contenitori, tuttavia ognuno dei miei tentativi è appena fallito e il mio contenitore pub/sub non viene avviato. Qualcuno può consigli su come debocciare questo problema? In qualche modo i registri docker non hanno nulla.

Ecco come stanno collegando i contenitori: sudo docker run -d -P --name pub_sub --link rabbitmq:rabbitmq1 image_pub_sub

Ed ecco come sto usando il nome alias nel mio codice pub/sub

factory = new ConnectionFactory(); 
factory.setHost("rabbitmq1"); 
try { connection = factory.newConnection(); 
channel = connection.createChannel(); 
channel.queueDeclare("pub", true, false, false, null); 
} 
catch (IOException e) { // TODO Auto-generated catch block 
e.printStackTrace(); } 

mi aspettavo che il mio codice pubblicare sarà una coda nel contenitore rabbitmq e inizia a inviare messaggi. Il mio codice di sottoscrizione si collegherà fondamentalmente allo stesso rabbitmq e inizierà a leggere i messaggi.

Quando faccio funzionare l'ordine non succede nulla ma si limita a stampare una lunga id del nuovo contenitore e exits..When corro sudo docker ps -a, posso vedere il seguente:

e8a50d5aefa5  image_pub_sub:latest  "/opt/pubsub/run.sh"  32 minutes ago  Exited (0) 32 minutes ago  pub_sub 

Quindi questo significa che il mio contenitore non è in esecuzione.

Proprio ora ho provato aggiornando il /etc/hosts lanciando un nuovo contenitore utilizzando il seguente comando: sudo docker run -i -t image_pub_sub /bin/bash. Modificato il /etc/hosts di questo nuovo contenitore e ha aggiunto la seguente voce <IP_ADDRESS> rabbitmq1 e corse il mio script /opt/pubsub/run.sh e aggiunge il file nohup con i seguenti messaggi:

Message Sent 
[x] Received 'Hello' 
Message Sent 
Message Sent 
[x] Received 'Hello' 
+0

È necessario fornire ulteriori informazioni; quali comandi hai usato per collegare i contenitori, qual è stato il risultato e cosa ti aspettavi? –

+0

Si prega di aggiungere questo alla domanda, piuttosto che come un commento. E facci sapere cosa succede quando esegui i comandi (il contenitore è ancora in esecuzione? Come fai a sapere che non funziona?).Inoltre, ottieni una shell nel contenitore e verifica la connessione al contenitore rabbitmq. –

+0

Grazie. Al momento non è chiaro se si ha un problema di rete o un problema di code/rabbitmq. Cosa succede se si esegue 'docker exec -it pub_sub ping rabbitmq1'? –

risposta

4

contenitore Una finestra mobile si fermerà quando completa il suo processo principale. Nel tuo caso, questo significa che le due applicazioni Java saranno biforcate sullo sfondo (a causa della chiamata nohup), quindi lo script verrà immediatamente completato e il contenitore verrà chiuso.

ci sono alcune soluzioni:

  • La soluzione più semplice e veloce è quello di rimuovere solo nohup chiamata dalla chiamata Java secondo. In questo modo lo script non uscirà fino alla chiusura della seconda applicazione Java.
  • Utilizzare un gestore di processi come runit o supervisord per gestire i processi.
  • Mettere i barattoli in contenitori separati e chiamare direttamente Java (questa sembra essere la soluzione migliore per me).
+0

Ciao Adrian, grazie mille per avermi aiutato con i primi ettiquetes mentre creavo post in questo forum. In secondo luogo un ringraziamento eccellente per aver fornito tanti modi per risolvere questo problema. Ecco il mio feedback su tutti questi. 1) Il primo era veloce, ho appena ricostruito il mio contenitore con le modifiche necessarie e ha funzionato :) – ashishjain

+0

2) Non ancora provato, ma qui è la mia comprensione per favore chiarire se questo è corretto. Utilizzare il supervisor.conf e aggiungerlo con entrambi i processi java. Ora basta avviare il processo di supervisione usando il file docker CMD ["/ usr/bin/supervisord"]. Poiché questo è un processo senza fine è ciò che suppongo. 3) L'aggiunta di barattoli in 2 contenitori separati non richiederebbe la creazione di 2 contenitori separati. Ognuno dei miei contenitori di build personalizzati con Java su di esso occupa 730 MB di spazio. Volevo solo sapere perché la consideri l'opzione migliore. – ashishjain

+0

@ user1507003 2) Sì, penso che lo riguardi 3) Se si utilizza la stessa immagine di base per entrambi i contenitori, non verrà utilizzato spazio aggiuntivo. È più idiota avere 1 processo per contenitore e sembrerebbe anche adattarsi bene al tuo codice distribuito. –

Problemi correlati