gpt4 book ai didi

shell - 如何让两个 JAR 在 "docker run container"上自动启动

转载 作者:太空宇宙 更新时间:2023-11-03 16:49:36 25 4
gpt4 key购买 nike

我希望在通过运行命令调用 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"]

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

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

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

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

谢谢!

最佳答案

第二条 CMD 指令替换了第一条,因此您需要对两条命令使用一条指令。

简单(不太好)的方法

您可以添加一个 bash 脚本来执行第二个命令和 block :

# 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/
它有一个比例如更容易使用的初始化系统。监督。

这是一个很好的起点: 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 时正确关闭。

关于shell - 如何让两个 JAR 在 "docker run container"上自动启动,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33283916/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com