在Ubuntu Docker容器中,Tomcat7无法启动

7

初始情况

在Ubuntu(14.04/14.10)中,我运行了以下命令:

apt-get update && apt-get install tomcat7
service tomcat7 start

一方面,我在VirtualBox虚拟机上尝试了这个操作,tomcat7如预期般启动:

vagrant init hashicorp/precise32
vagrant up

另一方面,我在Docker容器中尝试了这个操作,如下所示启动:

sudo docker run -it --name tomcattest ubuntu bash

问题
执行"service tomcat7 start"命令时会输出[fail]。尽管Tomcat正在运行,但"/var/log/tomcat7/catalina.out"显示如下内容:
Apr 16, 2015 5:52:40 PM org.apache.catalina.startup.ClassLoaderFactory validateFile
WARNING: Problem with directory [/usr/share/tomcat7/common/classes], exists: [false], isDirectory: [false], canRead: [false]
Apr 16, 2015 5:52:40 PM org.apache.catalina.startup.ClassLoaderFactory validateFile
WARNING: Problem with directory [/usr/share/tomcat7/common], exists: [false], isDirectory: [false], canRead: [false]
Apr 16, 2015 5:52:40 PM org.apache.catalina.startup.ClassLoaderFactory validateFile
WARNING: Problem with directory [/usr/share/tomcat7/server/classes], exists: [false], isDirectory: [false], canRead: [false]
Apr 16, 2015 5:52:40 PM org.apache.catalina.startup.ClassLoaderFactory validateFile
WARNING: Problem with directory [/usr/share/tomcat7/server], exists: [false], isDirectory: [false], canRead: [false]
Apr 16, 2015 5:52:40 PM org.apache.catalina.startup.ClassLoaderFactory validateFile
WARNING: Problem with directory [/usr/share/tomcat7/shared/classes], exists: [false], isDirectory: [false], canRead: [false]
Apr 16, 2015 5:52:40 PM org.apache.catalina.startup.ClassLoaderFactory validateFile
WARNING: Problem with directory [/usr/share/tomcat7/shared], exists: [false], isDirectory: [false], canRead: [false]
Apr 16, 2015 5:52:40 PM org.apache.coyote.AbstractProtocol init
INFO: Initializing ProtocolHandler ["http-bio-8080"]
Apr 16, 2015 5:52:40 PM org.apache.catalina.startup.Catalina load
INFO: Initialization processed in 514 ms
Apr 16, 2015 5:52:41 PM org.apache.catalina.core.StandardService startInternal
INFO: Starting service Catalina
Apr 16, 2015 5:52:41 PM org.apache.catalina.core.StandardEngine startInternal
INFO: Starting Servlet Engine: Apache Tomcat/7.0.52 (Ubuntu)
Apr 16, 2015 5:52:41 PM org.apache.catalina.startup.HostConfig deployDirectory
INFO: Deploying web application directory /var/lib/tomcat7/webapps/ROOT
Apr 16, 2015 5:52:42 PM org.apache.coyote.AbstractProtocol start
INFO: Starting ProtocolHandler ["http-bio-8080"]
Apr 16, 2015 5:52:42 PM org.apache.catalina.startup.Catalina start
INFO: Server startup in 1150 ms

搜索到解释

有人能解释一下不同的行为,并告诉我是否可以通过apt-get在Docker容器内轻松安装Tomcat7而不会出现警告吗?

2个回答

15

解决方案

Tomcat启动脚本需要一些特殊的权限,具体来说,它需要检查所有正在运行的进程并验证自身是否在运行。你可以为Docker容器提供以下特权,以使tomcat启动脚本成功退出:

sudo docker run --cap-add SYS_PTRACE -it ubuntu bash

重要的选项是--cap-add SYS_PTRACE,其他选项可能会有所不同。在docker github上有至少一个讨论此问题的问题:

https://github.com/docker/docker/issues/6800

后续问题

尽管如此,我还没有找到在镜像的docker构建中设置此权限的方法。我的终极目标是运行执行Ansible playbook的docker build。由于服务启动,构建仅失败,我不想将其从playbook中删除。我将进行进一步的调查,但欢迎提出可能的解决方案。


很好的发现,比我的答案更完整。+1 - VonC
@Thomas Steinbach:你有没有找到在Dockerfile本身中修复它的方法? - Arpit Aggarwal
@Arpit - 看起来 docker run 还没有这样的命令行参数。请参阅文档 - Thomas Steinbach
在docker-compose.yml中有配置选项cap_add。我已经尝试使用-ALL,现在服务在日志中显示为Done,但仍然在稍后的某个地方失败。我无法确定还缺少什么。如何调试这个问题?无论如何,有一个解决方法,就是在命令中添加附加内容,例如&& tail -f /var/log/tomcat/catalina.out。这是一个解决方案,除了你可能会失去对docker下面的服务进程的直接控制。 - zhrist
@Arpit - 有点晚了,但你已经链接了 docker build 的参考文档。请查看 docker run文档 - Thomas Steinbach

1

这篇文章报道了同样的错误(针对Tomcat8,但同样适用于Tomcat7):

我不知道为什么,但似乎Ubuntu上的Tomcat 8没有任何有意义的配置。一切都可用,但我们需要在这里和那里创建一些符号链接以及创建临时目录。这将转化为Dockerfile中的以下指令:

RUN ln -s /var/lib/tomcat8/common $CATALINA_HOME/common && \\
    ln -s /var/lib/tomcat8/server $CATALINA_HOME/server && \\
    ln -s /var/lib/tomcat8/shared $CATALINA_HOME/shared && \\
    ln -s /etc/tomcat8 $CATALINA_HOME/conf && \\
    mkdir $CATALINA_HOME/temp

但实际原因可能在于这个问题

CATALINA_BASE等只在/etc/init.d/tomcat8中设置。
在Docker镜像中,该服务不像完整的VM那样被初始化。


1
据我所了解,这个布局的“意义”是只有一个“/usr/share/tomcat8”,但可能有多个Tomcat 8实例和每个实例一个“/var/lib/tomcat-instance-name”。 - Tristan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接