如何让两个 JAR 在“docker run 容器”上自动启动

2023-12-21

我希望通过 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", "-jar", "second.jar"]

然而,这只会启动 secondary.jar。

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

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

我对 ubuntu 几乎一无所知,但我发现xterm打开新终端的命令,但是在调用 JAR 后这将不起作用。我正在寻找的是 dockerfile 内部的说明,例如打开一个新终端,执行first.jar,使用alt-tab键进入旧终端并在那里执行second.jar,或者至少实现相同的效果。

Thanks!


第二条 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/ https://blog.phusion.nl/2015/01/20/docker-and-the-pid-1-zombie-reaping-problem/

更好的方法

为了解决这个问题,你可以使用 Phusion:https://hub.docker.com/r/phusion/baseimage/ https://hub.docker.com/r/phusion/baseimage/
它有一个比例如更容易使用的初始化系统。主管。

这是一个很好的起点:https://github.com/phusion/baseimage-docker#getting_started https://github.com/phusion/baseimage-docker#getting_started

phusion使用说明

遗憾的是,没有适用于 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.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何让两个 JAR 在“docker run 容器”上自动启动 的相关文章

随机推荐

  • 使用 XDebug + PHPStorm 进行调试迫使我始终要进入

    我正在尝试调试我的密码接收 tests 我的调试平台使用PHPStorm X调试从正确的浏览器使用时效果很好IDE KEY作为饼干 但是 当尝试使用以下命令调试 codecept 时CLI我遇到以下问题 如果我在 Cest 类中放置断点 行
  • 为什么我无法在 Apache 中禁用 .htaccess?

    这与我读过的大多数问题相反 我在使用 Apache 2 2 8 的 Amazon 实例上运行 Ubuntu 8 04 我不明白为什么将 root 的 AllowOverride 设置为 None 不会阻止包含我的 htaccess 文件 我
  • 为什么Object类是java中的超类[关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 为什么object Class是java中的超类昨天我参加了一次面试 面试官问了我一些问题 因为 java lang 包中的 Object 类位
  • R 中 Arules 序列挖掘的主序列

    如何从 R 中 arulesSequence 包中的 cspade 算法中删除子序列 例如 如果我的数据 Sample txt 如下 列名称 sequenceID EventID 大小 项目 1 1 1 A 1 2 1 B 1 3 1 C
  • 用C编写命令行shell;第一次尝试使用 ncurses/C

    我正在开发一个类项目 在该项目中我必须编写一个具有以下要求的命令行 shell shell 必须能够读取缓冲的输入 缓冲区应为 64 个字符 Error conditions should be handled 超出缓冲区大小 中断 当信号
  • 需要检测多条线的 RANSAC

    这是一个有点理论问题 但我想知道当图像中检测到多条线时如何随机选择点 到目前为止 在我见过的大多数示例中 似乎只检测到一行 而且看起来很容易 但是 我不确定它如何扩展以检测具有更多点的多条线 我认为你是在一个基本的误解下运作的 RANSAC
  • 如何覆盖 TortoiseSVN 中的本地更改?

    假设我进行了检查 编辑了一些内容 并意识到我想重新下载存储库代码并覆盖我的本地更改而不提交它们 我下载了一个项目 进行了一些编辑 然后我意识到我不喜欢我的本地更改 我尚未提交 如何在不删除文件夹的情况下恢复到存储库的当前状态 我该怎么做呢
  • 为购物车应用程序设计数据库? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我从未从头开始设计数据库 数据模型 模式 尤其是对于 Web 应用程序 在最近的一些工作面试中 我被要求为购物车应用程序 设计 一个数
  • 从没有空格/组合词的文本中检测最有可能的单词

    如何从组合字符串中检测和拆分单词 Example cdimage gt cd image filesaveas gt file save as 这是一个动态编程解决方案 作为记忆函数实现 给定一个单词字典及其出现频率 它会将输入文本分割到给
  • 使滚动条轨道透明

    这里很少有提出相同问题的问题 但他们的解决方案对我不起作用 这是其中一个问题的图片以及我想要实现的目标 我有一个列表 当有更多项目时 会显示滚动条 我还将溢出 y 设置为覆盖 因为我不希望滚动条添加到列表的宽度 如何使轨道透明以便可以看到下
  • 如何查看Android系统版本?

    有谁知道如何检查系统版本 例如1 0 2 2等 以编程方式 如何使用它的示例 if android os Build VERSION SDK INT gt android os Build VERSION CODES GINGERBREAD
  • 如何在iPhone中使用“HTTP直播”播放视频?

    我是 iPhone 开发新手 我正在解析 XML URL 并将其内容显示在表格中 当我单击一行时 使用电影播放器 播放其相应的解析管 URL 我正在使用媒体播放器框架 这是我的代码 NSURL movieURL NSURL URLWithS
  • KarateAPI 中有类似 POJO 的功能吗?

    我使用 Karate 和 RestAssured 一段时间了 当然 这两种工具都有优点和缺点 现在我有一个 RestAssured 项目 其中有请求和响应对象以及 POJO 我的请求包装我的端点并将我的 POJO 发送到这些端点 我在抽象层
  • 如果我在实例方法中放置静态锁会发生什么?

    我是线程新手 目前正在阅读线程同步章节 我对线程锁定的一种情况有疑问 这是我所知道的 1 当我在实例方法中放置实例锁时 即 private Object lock1 new Object private Object lock2 new O
  • 如何为ggplot中的每个点使用不同的形状

    我正在绘制 4 维数据集 除了 x 轴和 y 轴之外 我想用不同宽度和高度的矩形表示第三个和第四个维度 我可以这样做吗ggplot 谢谢 这是一种方法 dd lt data frame x x lt 1 10 y x rnorm 10 wi
  • ts-loader / css-loader 无法导入/解析文件

    尝试使用 style loader 和 css loader 添加 css 模块 很难弄清楚这一点 我也不确定是 ts loader 的问题还是 css loader 的问题 webpack config js const path req
  • 向已分区的表添加分区

    将另一个分区添加到已分区表的最佳方法是什么 原本的CREATE TABLE声明如下 CREATE TABLE command log id bigint 20 NOT NULL insert time datetime NOT NULL s
  • 在 Python 中创建和维护多个 ssh 会话

    一旦我的程序启动 它就会打开任意数量的 ssh 会话 用户定义 并无限期地在服务器上运行特定命令 当真正循环时 或直到用户退出 出于效率原因 我只想创建每个会话一次 然后能够运行命令直到用户退出 我怎样才能在Python中做到这一点 我在另
  • Javascript::audio.pause是否将audio.currentTime值重置为0?

    我的代码运行完美except事实上 它不是暂停曲目 而是返回到曲目的开头 这是我的代码 var audio new Audio var hezi document querySelector player gt button hand va
  • 如何让两个 JAR 在“docker run 容器”上自动启动

    我希望通过 run 命令调用 docker 容器后自动执行两个单独的 JAR 文件 因此当我输入docker run mycontainer他们都被称为 到目前为止 我有一个如下所示的 dockerfile base image is ja