tomcat - 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 中调用类的正确方法。
解决方案
考虑 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"]
推荐阅读
- asp.net-core - 在 AspNetCore MVC Identity 中创建表 AspNetClaims
- javascript - 具有相同原始值的 React 钩子调用 setState 仍然会导致重新渲染
- javascript - 坚持使用线性优化函数优化投资组合权重
- php - 如何在laravel 5.5中的其他pdf文件中插入pdf页面
- java - java map和python字典的比较
- django - 如何在 .xls 文件的 django-import-export 中进行字段验证
- python - 基于 $ 的错误输出?bash 中的值
- java - 有没有办法持久化一个字段,但是在执行 GET 时,该字段没有序列化
- node.js - NodeJS 并行运行函数从 REST API 获取数据
- azure - 自动通过电子邮件发送 Azure 订阅成本分析仪表板