2015-10-22 139 views
5

自動啓動,我要兩個單獨的JAR文件一旦碼頭工人容器通過運行命令調用自動被執行,所以當我輸入docker run mycontainer它們都調用。到目前爲止,我有一個如下所示的dockerfile:如何有兩個JAR的「泊塢窗運行容器」

# base image is java:8 (ubuntu) 
FROM java:8 

# add files to image 
ADD first.jar . 
ADD second.jar . 

# start on run 
CMD ["/usr/lib/jvm/java-8-openjdk-amd64/bin/java", "-jar", "first.jar"] 
CMD ["/usr/lib/jvm/java-8-openjdk-amd64/bin/java", "-jar", "second.jar"] 

但是,這隻會啓動second.jar。

現在,這兩個罐子都是在一個循環的服務器,所以我想,一旦一個開始,它只是塊的終端。如果我使用run -it mycontainer bash運行容器並手動調用它們,則第一個將執行其輸出,而我無法啓動另一個。

有沒有辦法打開不同的終端,並在它們之間切換,以在其自己的上下文中的每個JAR運行?最好已經在dockerfile中。

我完全不知道Ubuntu的情況,但是我找到了打開一個新終端的xterm命令,但是在調用JAR之後這個命令不起作用。我正在尋找的是dockerfile內部的說明,例如打開一個新的終端,執行first.jar,alt-tab到舊的終端並在那裏執行second.jar,或者至少實現相同的目的。

謝謝!

回答

2

第二CMD指令替換第一個,所以你需要使用一個單一的指令這兩個命令。

易(不太好)方法

你可以添加一個bash腳本,在第二個執行命令和塊:

# start.sh 
/usr/lib/jvm/java-8-openjdk-amd64/bin/java -jar first.jar & 
/usr/lib/jvm/java-8-openjdk-amd64/bin/java -jar second.jar 

然後改變你的Dockerfile這樣:

# base image is java:8 (ubuntu) 
FROM java:8 

# add files to image 
ADD first.jar . 
ADD second.jar . 
ADD start.sh . 

# start on run 
CMD ["bash", "start.sh"] 

使用docker stop時,它可能無法正常關閉,請參閱: https://blog.phusion.nl/2015/01/20/docker-and-the-pid-1-zombie-reaping-problem/

更好的辦法

爲了解決這個問題,你可以使用的Phusion: https://hub.docker.com/r/phusion/baseimage/
它有一個init-系統,但更易於例如使用supervisord。

這裏是一個很好的起點: https://github.com/phusion/baseimage-docker#getting_started

說明使用Phusion

可悲的是沒有官方的OpenJDK-8 JDK提供的Ubuntu 14.04 LTS。你可以嘗試使用一個非官方的ppa,這在以下解釋中使用。

在你的情況,你需要的bash腳本(其中像「服務」):

# start-first.sh (the file has to start with the following line!): 
#!/bin/bash 
usr/lib/jvm/java-8-openjdk-amd64/bin/java -jar /root/first.jar 

# start-second.sh 
#!/bin/bash 
usr/lib/jvm/java-8-openjdk-amd64/bin/java -jar /root/second.jar 

和你Dockerfile應該是這樣的:

# base image is phusion 
FROM phusion/baseimage:latest 

# Use init service of phusion 
CMD ["/sbin/my_init"] 

# Install unofficial openjdk-8 
RUN add-apt-repository ppa:openjdk-r/ppa && apt-get update && apt-get dist-upgrade -y && apt-get install -y openjdk-8-jdk 

ADD first.jar /root/first.jar 
ADD second.jar /root/second.jar 

# Add first service 
RUN mkdir /etc/service/first 
ADD start-first.sh /etc/service/first/run 
RUN chmod +x /etc/service/first/run 

# Add second service 
RUN mkdir /etc/service/second 
ADD start-second.sh /etc/service/second/run 
RUN chmod +x /etc/service/second/run 

# Clean up 
RUN apt-get clean && rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/* 

這應該安裝兩個服務,將在啓動時運行,並在使用docker stop時正常關閉。

+0

感謝,腳本解決方案正是我一直在尋找。目前工作沒有問題!我也看了一下,以防萬一什麼事情發生。 – buggy

+1

很好聽! 我添加了一個例子,你如何設置phusion來啓動兩個罐子作爲單獨的「服務」。 – craeckie

0

如果你想開始一個泊塢窗容器(不建議報告行爲),你可以使用類似supervisord

1

您有幾個選項。許多答案都提到使用主管這個,這是一個很好的解決方案。這裏有一些其他的:

創建一個簡短的腳本,只是踢開兩個罐子。將其添加到您的CMD。例如,腳本,我們稱之爲run_jars.sh可能看起來像:

/usr/lib/jvm/java-8-openjdk-amd64/bin/java -jar first.jar; 
/usr/lib/jvm/java-8-openjdk-amd64/bin/java -jar second.jar; 

那麼你的CMD將CMD sh run_jars.sh

另一種方法是剛剛運行兩個單獨的containers--一個first.jar,另一個用於second.jar。您可以運行每一個通過docker run,例如:

docker run my_repo/my_image:some_tag /usr/lib/jvm/java-8-openjdk-amd64/bin/java -jar second.jar

+0

感謝不同的容器建議!我玩過它,如果bash腳本在執行期間導致問題,我可以回退到兩個容器,並使用--link命令讓它們互相呼叫。 – buggy