2015-02-19 12 views
5

Używam dockerfiles do zbudowania prostego kontenera. Oto Dockerfile:Jak uruchomić skrypt powłoki przy użyciu dockerfiles CMD

FROM XXXXXXX:5003/base-java 

MAINTAINER XXXXX 

ADD pubsub/ /opt/pubsub/ 

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

Zawartość run.sh jest następujący:

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

Jest to prosta aplikacja Java dla pub/sub.

Teraz mam kolejny kontener z królikiem i łączę 2 kontenery, jednak każda moja próba właśnie się nie udała i Mój kontener pub/sub się nie uruchamia. Czy ktoś może doradzić, jak rozwiązać problem z debuggowaniem? W jakiś sposób dzienniki dokowania nic nie mają.

Oto jak mam łączenie pojemników: sudo docker run -d -P --name pub_sub --link rabbitmq:rabbitmq1 image_pub_sub

A oto jak używam alias w kodzie 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(); } 

Spodziewałem się, że mój opublikować kod utworzy kolejkę w kontenerze rabbitmq i zacznij przesyłać wiadomości. Mój kod subskrybenta połączy się z tym samym królikiem i zacznie czytać wiadomości.

Kiedy biegnę Zdarza się po prostu drukuje długiego identyfikatora nowego pojemnika i exits..When biegnę sudo docker ps -a się nic polecenia, widzę następujące:

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

Więc oznacza to mój pojemnik nie jest bieganie.

Właśnie testowałem aktualizując /etc/hosts, uruchamiając nowy kontener za pomocą następującego polecenia: sudo docker run -i -t image_pub_sub /bin/bash. Zmodyfikował /etc/hosts tego nowego pojemnika i dodaje się następujący wpis <IP_ADDRESS> rabbitmq1 i prowadził mój skrypt /opt/pubsub/run.sh i dołącza plik nohup z następujących komunikatów:

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

Musisz podać więcej informacji; jakich poleceń użyłeś do połączenia kontenerów, jaki był rezultat i czego oczekiwałeś? –

+0

Proszę dodać to pytanie, a nie jako komentarz. I daj nam znać, co się dzieje, gdy uruchomisz komendy (czy kontener nadal działa? Skąd wiadomo, że nie działa?).Ponadto, zdobądź powłokę w kontenerze i przetestuj połączenie z kontenerem rabbitmq. –

+0

Dzięki. W tej chwili nie jest jasne, czy masz problem z siecią lub problem z kodem/rabbitmq. Co się stanie, jeśli uruchomisz 'docker exec -it pub_sub ping rabbitmq1'? –

Odpowiedz

4

Docker pojemnik zatrzyma się po zakończeniu jego głównym procesem. W twoim przypadku oznacza to, że dwie aplikacje Java zostaną rozwidlone do tła (z powodu wywołania nohup), a następnie skrypt zostanie natychmiast ukończony, a kontener zostanie zamknięty.

Istnieje kilka rozwiązań:

  • Najszybszym i najprostszym rozwiązaniem jest po prostu usunąć nohup połączenia z sekund java rozmowy. W ten sposób skrypt nie wyjdzie, dopóki nie zakończy się druga aplikacja Java.
  • Do zarządzania procesami użyj menedżera procesów, takiego jak runit lub supervisord.
  • Umieść słoiki w oddzielnych pojemnikach i wywołaj Javę bezpośrednio (to wydaje się być najlepszym rozwiązaniem dla mnie).
+0

Cześć Adrian, Bardzo dziękuję za pomoc przy pierwszych etiquetach podczas pisania postów na tym forum. Po drugie wielkie dzięki za dostarczenie tak wielu sposobów rozwiązania tego problemu. Oto moja opinia na temat wszystkich tych. 1) Pierwsza była szybka, po prostu przebudowałem mój pojemnik z niezbędnymi zmianami i zadziałał :) – ashishjain

+0

2) Jeszcze nie wypróbowany, ale tutaj jest moje zrozumienie proszę wyjaśnić, czy jest to poprawne. Użyj pliku supervisor.conf i dołącz go do obu procesów java. Teraz po prostu uruchom proces nadzoru za pomocą dockerfile CMD ["/ usr/bin/supervisord"]. Ponieważ jest to niekończący się proces, to jest to, jak przypuszczam. 3) Dodawanie słoików w 2 oddzielnych pojemnikach nie wymagałoby zbudowania 2 oddzielnych pojemników. Każdy z moich niestandardowych kontenerów do kompilacji z java zajmuje 730 MB miejsca. Chciałem tylko wiedzieć, dlaczego uważasz to za najlepszą opcję. – ashishjain

+0

@ user1507003 2) Tak, myślę, że o to chodzi 3) Jeśli użyjesz tego samego podstawowego obrazu dla obu pojemników, wtedy nie będzie żadnego dodatkowego miejsca. To bardziej idiomatyczne, że mamy 1 proces na pojemnik i wydaje się, że pasuje on również do rozproszonego kodu. –

Powiązane problemy