首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Tomcat、Docker、Logging和STDOUT?

Tomcat、Docker、Logging和STDOUT?
EN

Stack Overflow用户
提问于 2017-12-08 21:22:52
回答 6查看 16.1K关注 0票数 4

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

这是我的Dockerfile

代码语言:javascript
复制
FROM tomcat:7-jre8
COPY target/MYAPP.war /usr/local/tomcat/webapps/MYAPP.war
RUN ["/usr/local/tomcat/bin/catalina.sh", "start"]

这就是我如何构建镜像并从它启动容器:

代码语言:javascript
复制
docker build -t MYAPP .
docker run -it --rm -p 8080:8080 --name MYAPP MYAPP

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

我应该如何修改Dockerfile,应该使用哪个命令来运行它("docker run ...")因此,在使用"docker run stdout --rm -p 8080:8080 --name MYAPP MYAPP“启动容器MYAPP之后,/var/ -it /MYAPP.log内容将立即打印到stdout?

我试图将下面的命令添加到Dockerfile中,但是没有帮助。

代码语言:javascript
复制
CMD tail -f /usr/local/MYAPP.log
EN

回答 6

Stack Overflow用户

发布于 2017-12-08 21:32:40

您似乎对RUNCMD之间的区别感到困惑。

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

代码语言:javascript
复制
RUN ["/usr/local/tomcat/bin/catalina.sh", "start"]

...this意味着在docker build过程中,Docker会启动tomcat,但会立即杀死它并继续构建您的镜像。

只有CMDENTRYPOINT指令定义了在使用docker run引导映像时将运行的命令。所以你可能想要这样的东西:

代码语言:javascript
复制
CMD /usr/local/tomcat/bin/catalina.sh start && tail -f /usr/local/MYAPP.log
票数 6
EN

Stack Overflow用户

发布于 2018-06-07 06:26:03

好的,您的dockerfile应该包含这样的内容**

代码语言:javascript
复制
from tomcat:7-jre8
copy target/myapp.war /usr/local/tomcat/webapps/myapp.war
entrypoint ["/bin/bash", "/usr/local/tomcat/bin/catalina.sh", "run"]

然后,您可以运行基于此镜像的容器,如下所示:

代码语言:javascript
复制
docker run -itd -p 8080:8080 --name aname animage

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

代码语言:javascript
复制
docker logs aname

输出将是已发送到容器内的stdout的任何内容。您可以随心所欲地执行此操作,但常见的策略是将日志传输到logstash、splunk或上千个其他位置,或者您可以将其写入文件(尽管最后一个文件主要供开发人员使用)。

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

原始问题:您最初的问题是基于一个常见的错误;您试图在配置(构建映像)过程中运行tomcat服务器。当您运行容器时,您实际上想要运行服务器。因此,我删除了run并将其替换为入口点,这是运行如下命令的正确方式。最后,cmd用于向入口点传递参数,在本例中我们不需要这些参数。

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

参考文献

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

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

票数 3
EN

Stack Overflow用户

发布于 2020-03-11 01:37:02

要将所有日志定向到stdout,需要执行以下操作:

  1. How to stop application logs from logging into catalina.out in Tomcat得到的答案类似,您可以将CATALINA_OUT环境变量的值作为/dev/stdout传递。这将确保将所有tomcat日志发送到stdout.
  2. In logging.properties of catalina base,保留java.util.logging.ConsoleHandler并删除应用程序中日志记录配置的其他文件(例如,如果使用log4j2,则为log4j2.xml文件),以便将日志发送到stdout。在log4j2中,您可以使用console appender.

执行此操作

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47715280

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档