Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/docker/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用docker入口点执行java,然后在java进程完成后使用exec touch_Java_Docker_Kubernetes_Dockerfile_Kubernetes Pod - Fatal编程技术网

如何使用docker入口点执行java,然后在java进程完成后使用exec touch

如何使用docker入口点执行java,然后在java进程完成后使用exec touch,java,docker,kubernetes,dockerfile,kubernetes-pod,Java,Docker,Kubernetes,Dockerfile,Kubernetes Pod,我试着运行一个装有2个容器的吊舱。主容器执行docker java映像,该映像运行cron作业,另一个sidecar(logstash)容器读取日志并将其发送到Kibana服务器。当cron作业完成后,主容器完成,但sidecar容器继续运行,因为它不会正常关闭。我试着将容器生命周期挂钩预扣,但没有成功。 现在,我想尝试使用dockerfile停止sidecar容器。Docker ENTRYPOINT exec java image jar,一旦java进程完成,我想在主容器中创建/触摸一个文件

我试着运行一个装有2个容器的吊舱。主容器执行docker java映像,该映像运行cron作业,另一个sidecar(logstash)容器读取日志并将其发送到Kibana服务器。当cron作业完成后,主容器完成,但sidecar容器继续运行,因为它不会正常关闭。我试着将容器生命周期挂钩预扣,但没有成功。 现在,我想尝试使用dockerfile停止sidecar容器。Docker ENTRYPOINT exec java image jar,一旦java进程完成,我想在主容器中创建/触摸一个文件,我的另一个侧车容器会在其中查找触摸到的文件

这是我当前的dockerfile

FROM mcr.microsoft.com/java/jre:11-zulu-alpine
ARG projectVersion
WORKDIR /opt/example/apps/sync
COPY /target/sync-app-${projectVersion}.jar app.jar
ENTRYPOINT exec java $JAVA_OPTS -Djava.security.egd=file:/dev/./urandom -jar app.jar
我想在java进程执行完成后添加以下内容

echo "Going to kill sync-app container..."
trap 'touch /opt/example/apps/sync/container/done' EXIT
我真的很想知道,一旦ENTRYPOINT执行完成,是否可以执行上面的命令?(可能是将这些命令添加到脚本中,并将该脚本传递到入口点)。但是,我不确定需要添加哪些命令才能正确执行它

我为logstash容器编写的代码,该容器将查找文件(由第一个容器创建)


如果需要更多信息,请告诉我。提前谢谢你的帮助

您可以通过进程PID等待进程完成。
bash
解释器有一个名为
wait
的内置命令,如果使用子PID作为参数调用,它将等待子PID完成

因此,您可以创建以下entrypoint.sh并将其添加到java容器中

entrypoint.sh

#/bin/bash
echo“清除文件信号并运行入口点”
rm-rf/opt/example/apps/sync/container/done
execjava$java_OPTS-Djava.security.egd=file:/dev//uradom-jar app.jar&
child_pid=$!
echo“进程已启动,正在等待退出”
等等$child\u pid
echo“入口点退出,发出文件信号”
触摸/opt/example/apps/sync/container/done

您可以在主车和副车容器中安装一个空车斗

主容器在给定的位置写入一个文件,在该位置上,这个emptydir作为入口点中的最后一条语句挂载在入口点上,在它退出之前,sidecar有一个循环来检查这个文件的存在

一旦检测到,侧车容器不退出0

这有点粗糙,但应该可以完成

另一方面,Docker和Kubernetes对于如何处理日志有一些默认设置。它们从每个容器的STDOUT收集它们,并将输出存储在运行容器的节点(/var/lib/docker/containers)上的文件中。Logstah可以设置为在每个节点上运行的守护程序,容器日志位置作为主机路径安装,并跟踪上述文件。这样,您的容器就不需要任何sodecar,而且在我看来简化了整个设置,让logstash负责完成任何需要的日志记录工作

- args:
  - |
    dockerd-entrypoint.sh &
    while ! test -f /opt/example/apps/sync/container/done; do
      echo "Waiting for sync-app to finish..."
      sleep 5
    done
    echo "sync-app finished, exiting"
    exit 0
  command:
  - /bin/sh
  - -c