我解决了这个问题并发布了我的发现,以防它帮助其他有类似问题的人。
简短回答:不建议在单个容器中运行 multiple services (tomcat / mysql)。是的,有supervisor.d 等。但不鼓励这样做。如果您致力于在一个容器中提供多种服务,还有baseimage-docker。
如果你真的下定决心,这个答案的其余部分显示了我是如何让它工作的......
不幸的是,Ubuntu 16.04 上的 Tomcat 8 发行版仅配置为作为服务运行(下面将详细介绍)。在 docker 容器中运行服务的问题在堆栈交换的许多帖子中都有很好的记录(不鼓励)。通过在“service tomcat8 start”命令的末尾添加“tail -f /var/log/tomcat8/catalina.out”并使用“--cap”启动容器,我能够让 tomcat 8 作为服务运行-添加 SYS_PTRACE" 选项。
CMD service tomcat8 start && tail -f /var/log/tomcat8/catalina.out
推荐的启动tomcat8的方法是使用/usr/share/tomcat8/bin中的命令。但是distro版本的软链接不正确导致服务器无法启动。
使用命令./catalina.sh run 或./startup.sh 都会产生如下错误:
SEVERE: Cannot find specified temporary folder at /usr/share/tomcat8/temp
WARNING: Unable to load server configuration from [/usr/share/tomcat8/conf/server.xml]
SEVERE: Cannot start server. Server instance is not configured.
发行版将tomcat8 拆分为/usr/share/tomcat8 和/var/lib/tomcat8,从而将bin 文件(catalina.sh 和startup.sh)与config 和logs 中的/var/lib/tomcat8 软链接分开。这会使这些命令失败。
/usr/share/tomcat8中的文件:
root@85d5fe47b66a:/usr/share/tomcat8# ls -la
total 32
drwxr-xr-x 4 root root 4096 Mar 9 22:18 .
drwxr-xr-x 117 root root 4096 Mar 9 23:29 ..
drwxr-xr-x 2 root root 4096 Mar 9 22:18 bin
-rw-r--r-- 1 root root 39 Mar 31 2017 defaults.md5sum
-rw-r--r-- 1 root root 1929 Apr 10 2017 defaults.template
drwxr-xr-x 2 root root 4096 Mar 9 22:18 lib
-rw-r--r-- 1 root root 53 Mar 31 2017 logrotate.md5sum
-rw-r--r-- 1 root root 118 Apr 10 2017 logrotate.template
/var/lib/tomcat8中的文件:
root@85d5fe47b66a:/var/lib/tomcat8# ls -la
total 16
drwxr-xr-x 4 root root 4096 Mar 9 22:18 .
drwxr-xr-x 41 root root 4096 Mar 9 23:29 ..
lrwxrwxrwx 1 root root 12 Sep 28 14:43 conf -> /etc/tomcat8
drwxr-xr-x 2 tomcat8 tomcat8 4096 Sep 28 14:42 lib
lrwxrwxrwx 1 root root 17 Sep 28 14:43 logs -> ../../log/tomcat8
drwxrwxr-x 3 tomcat8 tomcat8 4096 Mar 9 22:18 webapps
lrwxrwxrwx 1 root root 19 Sep 28 14:43 work -> ../../cache/tomcat8
运行./version.sh 显示CATALINA_BASE 和CATALINA_HOME 都设置为/usr/share/tomcat8
Using CATALINA_BASE: /usr/share/tomcat8
Using CATALINA_HOME: /usr/share/tomcat8
Using CATALINA_TMPDIR: /usr/share/tomcat8/temp
Using JRE_HOME: /usr
Using CLASSPATH: /usr/share/tomcat8/bin/bootstrap.jar:/usr/share/tomcat8/bin/tomcat-juli.jar
Server version: Apache Tomcat/8.0.32 (Ubuntu)
Server built: Sep 27 2017 21:23:18 UTC
Server number: 8.0.32.0
OS Name: Linux
OS Version: 4.4.0-116-generic
Architecture: amd64
JVM Version: 1.8.0_161-b12
JVM Vendor: Oracle Corporation
在catalina.sh内将CATALINA_BASE显式设置为/var/lib/tomcat8解决了使用./catalina.sh run启动tomcat的问题。过去,我在/usr/share/tomcat8 目录下添加了指向conf、logs 和work 的软链接,以便它可以找到这些文件并使用catalina.sh run 命令正确启动。
顺便说一句,即使上面的version.sh 转储中的JRE_HOME 明显错误,服务确实启动正确(当我如前所述附加tail -f 命令时)。当我手动将正确的CATALINA_BASE 变量添加到catalina.sh 时,它也开始使用catalina.sh run。所以我没有花时间研究为什么列出不正确。
最后,我明白了三件事:
- 不建议在单个容器中运行multiple services (tomcat / mysql)。是的,有supervisor.d 等。但不鼓励这样做。如果您致力于在一个容器中提供多种服务,还有baseimage-docker。
- 不建议在容器中运行单个服务,但有文档记录的方法可以使其工作(我通过在 CMD 末尾添加
&& tail -f ... 为 tomcat8 做的)。
- 在 Ubuntu 16.04(未测试其他发行版)中,要使 tomcat8 作为命令(而非服务)运行,您需要:
a) 获取 Tomcat 8 的 tar 文件并安装它,因为它将所有文件放在一个目录下,因此不存在软链接问题。或者,b) 如果你坚持使用来自 apt-get 的 distro tomcat8,b.1) 你需要通过添加
CATALINA_BASE 来修改 catalina.sh 的版本并将其复制到正确的安装目录或 b.2)添加软链接。