加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

shell – 如何在“docker run container”上自动启动两个JAR

发布时间:2020-12-15 21:44:30 所属栏目:安全 来源:网络整理
导读:一旦通过run命令调用docker容器,我希望自动执行两个单独的JAR文件,因此当我输入docker run mycontainer时,它们都被调用.到目前为止,我有一个看起来像这样的dockerfile: # base image is java:8 (ubuntu)FROM java:8# add files to image ADD first.jar .ADD
一旦通过run命令调用docker容器,我希望自动执行两个单独的JAR文件,因此当我输入docker run mycontainer时,它们都被调用.到目前为止,我有一个看起来像这样的dockerfile:

# 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","second.jar"]

但是,这只会启动second.jar.

现在,两个罐子都是循环中的服务器,所以我想一旦启动它就会阻塞终端.如果我使用run -it mycontainer bash运行容器并手动调用它们,第一个将执行其输出而我无法启动另一个.

有没有办法打开不同的终端并在它们之间切换,让每个JAR在自己的上下文中运行?最好已经在dockerfile中.

我对ubuntu几乎一无所知但是我找到了打开一个新终端的xterm命令,但是在调用JAR之后这不起作用.我正在寻找的是dockerfile内部的指令,例如打开一个新终端,执行first.jar,alt-tab到旧终端并执行second.jar,或者至少实现相同.

谢谢!

解决方法

第二个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"]

使用泊坞窗时,它可能无法正常关闭,请参阅:
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

使用错误的说明

遗憾的是,Ubuntu 14.04 LTS没有正式的openjdk-8-jdk.您可以尝试使用非官方的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时正确关闭.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读