首页 > 解决方案 > k8s pod启动时启动tomcat后运行脚本

问题描述

在 pod 中启动 tomcat 后,我​​正在尝试运行一个 pod-bootstrapping 脚本(它基本上运行一个 java 程序)。我的 pod 运行一个基于 tomcat 的容器。这是我正在工作和重新工作的片段:

     - image: myreg/mydir/myimg:local
       name: tomcat-adminapp
       command: ["/bin/sh"]
       args: ["-c", "$CATALINA_HOME/bin/startup.sh && /scripts/runUpg.sh"]

runUpg.sh 脚本:

#!/bin/sh
ls -l $CATALINA_HOME/webapps/app/WEB-INF/lib/
chmod 755 $CATALINA_HOME/webapps/app/WEB-INF/lib/*
java -classpath "$CATALINA_HOME/webapps/app/WEB-INF/lib/*" com.myclass.Upg <args> 
tail -f /dev/nul

它正在启动 tomcat,但我的脚本执行失败。当我执行到 pod 中时,我看到战争爆发了,CATALINA_HOME 已设置并且 tomcat 进程正在运行。但我在 kubectl 日志中看到以下脚本错误:

ls: 无法访问'/userhome/tomcat/webapps/app/WEB-INF/lib/': 没有这样的文件或目录 chmod: 无法访问'/userhome/tomcat/webapps/app/WEB-INF/lib/*':没有这样的文件或目录错误:找不到或加载主类 com.myclass.Upg 原因:java.lang.ClassNotFoundException:com.myclass.Upg

从错误中我猜测 shell 脚本可能没有等待 tomcat 完成启动。我不确定为什么..

当我从 pod 内部手动运行脚本时,它运行良好。

任何指针在这里表示赞赏..

更新:我确认确实是时间问题。当我使用$CATALINA_HOME/bin/startup.sh && sleep 60 && /scripts/runUpg.sh时,脚本似乎运行良好。但我认为这是 hack-ish 而不是在 webapp 中调用类的正确方法。

标签: tomcatkubernetes

解决方案


考虑 postStart 钩子在容器启动后执行脚本。

样品参考


apiVersion: v1
kind: Pod
metadata:
  name: lifecycle-demo
spec:
  containers:
  - name: lifecycle-demo-container
    image: nginx
    lifecycle:
      postStart:
        exec:
          command: ["/bin/sh", "-c", "echo Hello from the postStart handler > /usr/share/message"]

推荐阅读