2015-02-19 8 views
5

Ich verwende Dockerfiles, um einen einfachen Container zu erstellen. Hier ist die Dockerfile:So führen Sie ein Shell-Skript mit dockerfiles CMD

FROM XXXXXXX:5003/base-java 

MAINTAINER XXXXX 

ADD pubsub/ /opt/pubsub/ 

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

Inhalt von run.sh ist wie folgt:

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

Dies ist einfache Java-Anwendung für pub/sub.

Jetzt habe ich einen anderen Container running rabbitmq und ich verbinde die 2 Container aber jeder meiner Versuch hat gerade versagt und mein pub/sub Container startet nicht. Kann jemand raten, wie man dieses Problem debuggen kann? Irgendwie hat Docker Logs nichts.

Hier ist, wie ich die Behälter am Verknüpfung: sudo docker run -d -P --name pub_sub --link rabbitmq:rabbitmq1 image_pub_sub

Und hier ist, wie ich den Alias-Namen in meinem pub/sub Code bin mit

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(); } 

Ich hatte erwartet, dass meine veröffentlichen Code eine Warteschlange erstellen wird im Rabbitmq-Container und starten Sie Push-Nachrichten. Mein Teilnehmercode wird im Grunde mit dem selben Rabbitmq verbunden und fängt an, die Nachrichten zu lesen.

Wenn ich den Befehl nichts laufen geschieht es druckt nur eine lange ID des neuen Container und exits..When ich sudo docker ps -a laufen, kann ich sehen, wie folgt:

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

Dies bedeutet also, mein Behälter nicht ist Laufen.

Gerade habe ich getestet, indem Sie die /etc/hosts aktualisieren, indem Sie einen neuen Container mit dem folgenden Befehl starten: sudo docker run -i -t image_pub_sub /bin/bash. Veränderte die /etc/hosts diesen neuen Container und hinzugefügt, um den folgenden Eintrag <IP_ADDRESS> rabbitmq1 und lief meinen Skript /opt/pubsub/run.sh und es fügt die nohup-Datei mit den folgenden Meldungen:

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

Sie müssen weitere Informationen angeben; Mit welchen Befehlen haben Sie die Container verknüpft, was war das Ergebnis und was haben Sie erwartet? –

+0

Bitte fügen Sie dies der Frage und nicht als Kommentar hinzu. Und lassen Sie uns wissen, was passiert, wenn Sie die Befehle ausführen (läuft der Container noch? Woher wissen Sie, dass es nicht funktioniert?).Holen Sie auch eine Schale in den Behälter und testen Sie die Verbindung mit dem Rabbitmq-Container. –

+0

Danke. Im Moment ist es nicht klar, ob Sie ein Netzwerkproblem oder ein code/rabbitmq-Problem haben. Was passiert, wenn Sie 'docker exec -it pub_sub ping rabbitmq1' ausführen? –

Antwort

4

Ein Docker Behälter stoppt, wenn sein Hauptprozess abgeschlossen ist. In Ihrem Fall bedeutet dies, dass die zwei Java-Anwendungen in den Hintergrund gegabelt werden (wegen des Aufrufs nohup), dann wird das Skript sofort beendet und der Container wird beendet.

Es gibt ein paar Lösungen:

  • Die schnellste und einfachste Lösung ist, einfach nohup Anruf von dem Java-Aufruf Sekunden zu entfernen. Auf diese Weise wird das Skript erst beendet, wenn die zweite Java-Anwendung beendet wird.
  • Verwenden Sie einen Prozessmanager wie runit oder supervisord, um die Prozesse zu verwalten.
  • Setzen Sie die Gläser in separaten Behältern und rufen Sie Java direkt (dies scheint die beste Lösung für mich zu sein).
+0

Hallo Adrian, Vielen Dank für mich mit dem ersten ettiquetes helfen, während Beiträge in diesem Forum zu machen. Zweitens ein super Dank für die Bereitstellung so vieler Möglichkeiten, dieses Problem zu lösen. Hier ist mein Feedback zu all diesen. 1) Zunächst war ein schnell ein, ich meine Behälter mit den notwendigen Veränderungen gerade umgebaut und es funktionierte :) – ashishjain

+0

2) Noch nicht versucht, aber hier ist mein Verständnis, bitte klären, ob dies richtig ist. Benutze die supervisor.conf und füge sie den beiden Java-Prozessen bei. Starten Sie jetzt einfach den Supervisord-Prozess mit dem Dockerfile CMD ["/ usr/bin/supervisord"]. Da dies ein nie endender Prozess ist, nehme ich an. 3) Hinzufügen von Gläsern in 2 getrennten Behältern würde es erfordern 2 getrennten Behältern aufzubauen. Jeder meiner benutzerdefinierten Build-Container, auf denen Java installiert ist, benötigt 730 MB Speicherplatz. Ich wollte nur wissen, warum Sie dies als die beste Option betrachten. – ashishjain

+0

@ user1507003 2) Ja, ich denke, dass über es ist 3) Wenn Sie das gleiche Basis-Image für beide der Behälter verwenden, dann wird es kein zusätzlicher Raum verwendet werden. Es ist idiomatischer, einen Prozess pro Container zu haben, und es scheint auch gut zu Ihrem verteilten Code zu passen. –

Verwandte Themen