我需要一个部署,其中每个 pod 有一个容器,每个容器有 2 个 java 进程在运行。因为,一个容器从一个进程(P1)开始,如果那个特定的进程(P1)被杀死,pod 会重新启动。是否有可能我从 2 个进程启动容器,即使其中一个进程被杀死,容器(或在我们的例子中是 pod,因为每个 pod 只有一个容器)会重新启动?我找不到任何与此相关的文档,说明它可以/不能完成。另外,如何使用 2 个进程启动容器?如果我在我的 docker 镜像中尝试这样的操作(javaProcess 是一个 java 文件),它只会运行第一个进程:
java -jar abc.jar
java javaProcess
or
java javaProcess
java -jar abc.jar
Run Code Online (Sandbox Code Playgroud)
如果我用一个进程(P1)启动容器并在容器启动后启动另一个进程(P2),则容器不会绑定到 P2,因此如果 P2 终止,容器将不会重新启动。但是,我需要它重新启动!
您可以使用supervisord来做到这一点。您的主进程应该绑定到 docker 镜像中的 supervisord,并且应该使用 supervisord 管理两个 java 进程。
supervisord 的主要目的是根据其配置文件中的数据创建和管理进程。它通过创建子流程来做到这一点。由 supervisor 产生的每个子进程在其整个生命周期内都由 supervisord 管理(supervisord 是它创建的每个进程的父进程)。当孩子死亡时,监督者会通过 SIGCHLD 信号通知其死亡,并执行适当的操作。
以下是启动两个 java 进程的示例 supervisord 配置文件。(supervisord.conf)
[supervisord]
nodaemon=true
[program:java1]
user=root
startsecs = 120
autorestart = true
command=java javaProcess1
[program:java2]
user=root
startsecs = 120
autorestart = true
command=java javaProcess2
Run Code Online (Sandbox Code Playgroud)
在您的 docker 文件中,您应该执行以下操作:
RUN apt-get update && apt-get install -y supervisor
RUN mkdir -p /var/log/supervisor
COPY supervisord.conf /etc/supervisor/conf.d/supervisord.conf
CMD ["/usr/bin/supervisord"]
Run Code Online (Sandbox Code Playgroud)