我一直在尝试在apt-get install tomcat7
上安装Ubuntu的Docker镜像上的apt-get install tomcat7
。 安装工作正常,并从catalina.sh启动tomcat。
我需要从“service tomcat7 start”启动tomcat,而不是。 不pipe失败的结果,如果我wget localhost:8080
我可以看到tomcat回答,如果我ps -ef | grep tomcat
ps -ef | grep tomcat
我可以看到这个过程。
同样,如果我运行service tomcat7 status
它说,即使它是和PID文件确实存在,tomcat不运行。
我注意到,当我从catalina脚本启动tomcat时,创build的pid文件被称为tomcat.pid ,但是/etc/init.d/tomcat
脚本会尝试读取tomcat7.pid 。
但是,强制脚本中的名称偷看正确的pid文件,并不能解决问题。
有没有人经历过这个?
我尝试的docker文件的Ubuntu版本并不真正相关,因为我已经尝试了几个。
无论如何,我主要使用的是12.10和14.04 。
谢谢!
在我使用的Docker Ubuntu映像(5506de2b643b – 14.04.1 LTS)中,带有--test
参数的start-stop-daemon工作不正常,并报告说tomcat没有运行,即使是这样。
tomcat7 init.d脚本启动tomcat,因为start-stop-daemon --test
说(正确)tomcat没有运行,但是稍后在启动过程中它检查tomcat是否启动成功并且正在运行。 start-stop-daemon --test
现在测试不正确,说tomcat没有运行,导致tomcat7 init.d脚本删除PID文件。
因此,当tomcat运行时, service tomcat7 status
返回false,因为PID文件不存在,但由于start-stop-daemon --test
的错误,即使PID文件存在正确的PID,它也将返回false。
这里是一个演示bug的示例会话:
#TOMCAT PID IS 43 root@a2cf26ade2a9:/# ps -eaf | grep tomcat7 tomcat7 43 1 0 14:06 ? 00:00:04 /usr/lib/jvm/java-7-oracle/bin/java -Djava.util.logging.config.file=/var/lib/tomcat7/conf/logging.properties -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -Djava.awt.headless=true -Xmx128m -XX:+UseConcMarkSweepGC -Djava.endorsed.dirs=/usr/share/tomcat7/endorsed -classpath /usr/share/tomcat7/bin/bootstrap.jar:/usr/share/tomcat7/bin/tomcat-juli.jar -Dcatalina.base=/var/lib/tomcat7 -Dcatalina.home=/usr/share/tomcat7 -Djava.io.tmpdir=/tmp/tomcat7-tomcat7-tmp org.apache.catalina.startup.Bootstrap start #PID FILE HAS CORRECT PID root@a2cf26ade2a9:/# cat /var/run/tomcat7.pid 43 #START-STOP-DAEMON --TEST REPORTS THAT IT WOULD START TOMCAT root@a2cf26ade2a9:/# start-stop-daemon --test --start --pidfile /var/run/tomcat7.pid --user tomcat7 --exec /usr/lib/jvm/java-7-oracle/bin/java Would start /usr/lib/jvm/java-7-oracle/bin/java . root@a2cf26ade2a9:/# echo $? 0
Docker不会启动任何OS服务,只有Dockerfile中给出的命令或显式的命令行。
我的理解是, service
和相关的命令依赖于一个不存在的init进程。
你应该从Catalina脚本中明确地启动你的tomcat。 你可以用supervisord之类的东西来包装,以获得“重启,如果它崩溃”的行为。
我遇到过这个 我通过将JAVA_HOME=/usr/lib/jvm/java-8-oracle
到/etc/default/tomcat7
来修复它(最后)。 出于某种原因,它使用JAVA_HOME
来实际运行进程,但它使用/usr/lib/jvm/default-java
来检查进程是否正在运行。 这让它感到困惑,所以它从来没有发现过程正在运行。
我碰巧遇到了一些情况,这是由于删除了/var/lib/tomcat7/logs
目录,我在那里重新制作了目录,它由另外一个用户拥有,这样tomcat7
不能重启,而不是日志输出,我改了自己的,现在它工作正常。
sudo chown tomcat7.tomcat7 /var/log/tomcat7 sudo chown tomcat7.tomcat7 /var/lib/tomcat7/logs