4

我在docker中运行tomcat,但看不到日志。它们被写入 tomcat/logs 下的各种日志文件,但是当 tomcat 在 docker 容器中运行时我看不到它们。

这是我的 Dockerfile

FROM tomcat:7-jre8
COPY target/MYAPP.war /usr/local/tomcat/webapps/MYAPP.war
RUN ["/usr/local/tomcat/bin/catalina.sh", "start"]

这就是我构建图像并从中启动容器的方式:

docker build -t MYAPP .
docker run -it --rm -p 8080:8080 --name MYAPP MYAPP

我的应用程序在tomcat部署MYAPP.war后创建日志文件:/var/log/MYAPP.log

我应该如何修改 Dockerfile 以及我应该使用哪个命令来运行它(“docker run ...”),以便在使用 oneliner “docker run -it --rm -p 8080:8080 --name”启动容器 MYAPP 之后立即MYAPP MYAPP" /var/log/MYAPP.log 的内容会打印到标准输出吗?

我尝试将以下命令添加到 Dockerfile 中,但没有帮助。

CMD tail -f /usr/local/MYAPP.log
4

6 回答 6

6

您似乎对RUN和之间的不同感到困惑CMD

RUN指令用于在构建过程中运行命令。它永远不会在容器中执行。当你写...

RUN ["/usr/local/tomcat/bin/catalina.sh", "start"]

...这意味着在此docker build过程中,Docker 将启动 tomcat,但会立即将其杀死并继续构建您的映像。

只有CMDENTRYPOINT指令定义了在你用docker run. 所以可能你想要这样的东西:

CMD /usr/local/tomcat/bin/catalina.sh start && tail -f /usr/local/MYAPP.log
于 2017-12-08T13:32:39.587 回答
3

需要执行以下操作以将所有日志定向到标准输出:

  1. 如何停止应用程序日志在 Tomcat 中登录 catalina.out的答案类似,您可以将 CATALINA_OUT 环境变量值传递为/dev/stdout. 这将确保所有 tomcat 日志都发送到标准输出。
  2. 在 catalina base 的 logging.properties 中,保留java.util.logging.ConsoleHandler并删除其他处理程序。
  3. 更改应用程序中的日志记录配置(例如,如果您使用 log4j2,则为 log4j2.xml 文件)以将日志发送到标准输出。在 log4j2 中,您可以使用控制台 appender来完成。
于 2020-03-10T17:37:02.227 回答
3

好的,您的 dockerfile 应该包含如下内容**:

from tomcat:7-jre8
copy target/myapp.war /usr/local/tomcat/webapps/myapp.war
entrypoint ["/bin/bash", "/usr/local/tomcat/bin/catalina.sh", "run"]

然后你可以运行一个基于这个镜像的容器,比如:

docker run -itd -p 8080:8080 --name aname animage

因此,catalina 'run' 命令旨在将所有日志重定向到标准输出。这对我们很有用,因为这就是 docker 的工作方式。如果您现在运行容器,您将能够运行:

docker logs aname

输出将是已发送到容器内标准输出的任何内容。你可以随心所欲地做这件事,但常见的策略是将日志传输到 logstash、splunk 或其他一千个地方,或者你可以将它们写入一个文件(尽管最后一个主要用于开发人员)。

** 当然,您必须更改入口点以匹配您的安装细节。我在这里展示的运行命令是针对守护进程的。

原始问题:您的原始问题是基于一个常见错误;您试图在配置(构建映像)期间运行 tomcat 服务器。您实际上想在运行容器时运行服务器。因此,我删除了run并用入口点替换了它,这是运行这样的命令的正确方法。最后,cmd用于将参数传递给入口点,在这种情况下我们不需要。

最后,我选择使用cataline.sh run而不是start因为run旨在将日志发送到标准输出而不是文件,就像start那样。

参考

查看日志:https ://docs.docker.com/config/containers/logging/

Conf 日志:https ://docs.docker.com/config/containers/logging/configure/

于 2018-06-06T22:26:03.283 回答
1

在这里找到了一个不错的方法: https ://github.com/Scout24/tomcat-stdout-accesslog/issues/2

替换 server.xml 文件中的以下 Valve。

<Valve className="org.apache.catalina.valves.AccessLogValve" directory="/proc/self/fd"
       prefix="1" suffix="" rotatable="false"
       pattern="%h %l %u %t &quot;%r&quot; %s %b" />

仅限 Linux!

这种“好方法”按预期对我有用。

于 2020-07-07T14:35:59.780 回答
1

以下在Tomcat 9.0.37中为我工作:

而不是使用 ./statup.sh使用 ./catalina.sh run 来启动tomcat服务器。

于 2020-11-27T08:58:44.347 回答
0

将日志直接写入标准输出而不是容器中的文件可能会更好。重启后会丢失。

有关详细信息,请参阅https://12factor.net/logs

于 2017-12-08T14:08:18.303 回答