Tomcat,Docker,日志记录和STDOUT?

Ole*_*leg 1 logging tomcat 12factor docker

我正在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"]
Run Code Online (Sandbox Code Playgroud)

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

docker build -t MYAPP .
docker run -it --rm -p 8080:8080 --name MYAPP MYAPP
Run Code Online (Sandbox Code Playgroud)

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

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

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

CMD tail -f /usr/local/MYAPP.log
Run Code Online (Sandbox Code Playgroud)

Rit*_*esh 8

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

  1. 与如何阻止应用程序日志登录到 Tomcat 中的 catalina.out给出的答案类似,您可以将 CATALINA_OUT 环境变量值传递为/dev/stdout。这将确保所有 tomcat 日志都发送到 stdout。
  2. 在catalina基础的logging.properties中,保留java.util.logging.ConsoleHandler并删除其他处理程序。
  3. 更改应用程序中的日志记录配置(例如,如果您使用 log4j2,则更改 log4j2.xml 文件)以将日志发送到 stdout。在 log4j2 中,您可以使用控制台追加器来完成此操作。


lar*_*sks 5

您似乎对RUN和之间的区别感到困惑CMD

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

RUN ["/usr/local/tomcat/bin/catalina.sh", "start"]
Run Code Online (Sandbox Code Playgroud)

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

只有CMDENTRYPOINT指令定义了使用引导映像时将运行的命令docker run。因此,您可能想要以下内容:

CMD /usr/local/tomcat/bin/catalina.sh start && tail -f /usr/local/MYAPP.log
Run Code Online (Sandbox Code Playgroud)

  • 这个真的不推荐。如果你只是使用 `catalina.sh run` 而不是 `start`,那么日志将被重定向到标准输出,你会发现它们很容易使用 docker 工具访问(`docker logs ...`) (2认同)