2015-10-22 96 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