Docker 日志问题 : Logs are not created or displayed in Tomcat's logs folder in docker container

标签 docker docker-container war

我们正在使用 Docker 容器并创建了一个 Dockerfile。在此容器内,我们使用 tomcat 镜像部署了 war 文件 我们可以在控制台看到 tomcat 日志,但控制台日志没有更新 通过 URL 向 tomcat 发送请求后。 此外,我们在 tomcat 日志文件夹中看不到任何日志文件

谁能帮我看看如何查看 localhost.logs/catalina.logs/manager.logs 等 tomcat 日志

我的 Dockerfile 是:-

FROM openjdk:6-jre

ENV CATALINA_HOME /usr/local/tomcat
ENV PATH $CATALINA_HOME/bin:$PATH

COPY tomcat $CATALINA_HOME

ADD  newui.war  $CATALINA_HOME/webapps

CMD $CATALINA_HOME/bin/startup.sh && tail -F $CATALINA_HOME/logs/catalina.out

EXPOSE 8080

使用下面的脚本来构建

$ docker build -t tomcat .

及以下用于运行tomcat

$ docker run -p 8080:8080 tomcat

最佳答案

您的 dockerfile 存在一些问题: 您提到您需要 java 6,但在撰写本文时 FROM java 行设置为使用 java:8。

您需要将 FROM 行替换为 FROM java:6-jre 或按照 official page 的建议: FROM openjdk:6-jre 如果到了 2018 年你仍然需要 java 6,这是危险的。我还强烈建议至少使用 FROM tomcat:7 ,它应该能够运行 java 6 小程序,但会包含一些错误修复,包括支持 HTTPS 的较长 Diffie-Hellman 素数(如果您认真的话)关于您的应用程序的安全性)。

Copt tomcat $CATALINA_HOME 您要么错过了 SO 行,要么根本不应该构建您的镜像。它应该是COPY tomcat $CATALINA_HOME

鉴于您正在使用 COPY 命令,因此无需在此之前使用 RUN mkdir -p,因为 COPY 命令将自动创建所有必需的文件夹。

CMD $CATALINA_HOME/bin/startup.sh && tail -f $CATALINA_HOME/logs/catalina.out

首先是 tail -f 部分:因为您正在寻找可能在服务器操作期间创建和重新创建的日志文件,而不是遵循 FD,所以您应该通过执行 tail -F(大写F)

startup.sh && tail - tail 将永远不会启动,直到startup.sh 退出。更好的方法是在启动 tomcat 服务器之前在startup.sh 中执行 tail -F $CATALINA_HOME/logs/catalina.out & 。这样 tail 将在后台运行。

不管怎样,这是一种有点危险的方法,你会面临僵尸进程的风险,因为 bash 不管理其子进程,docker 也不管理。我建议使用supervisord或类似的东西。

(来自 https://docs.docker.com/engine/admin/multi-service_container/ )

FROM ubuntu:latest
RUN apt-get update && apt-get install -y supervisor
RUN mkdir -p /var/log/supervisor
COPY supervisord.conf /etc/supervisor/conf.d/supervisord.conf
COPY my_first_process my_first_process
COPY my_second_process my_second_process
CMD ["/usr/bin/supervisord"]

注意:此 dockerfile 示例省略了一些最佳实践,例如在执行 apt-get 更新的同一运行命令中删除 apt 缓存。

个人最喜欢的是 phusion/baseimage,但设置起来比较困难,因为您需要将包括 java 在内的所有内容安装到镜像中。


如果进行所有这些修改后您仍然没有看到控制台更新,那么您还需要发布您的startup.sh文件或其他tomcat相关配置的内容。

P.S.:最好执行 RUN mkdir -p $CATALINA_HOME/logs 只是为了确保存在可供 tomcat 写入的日志文件夹。

P.P.S.:java基础镜像实际上使用的是openjdk而不是oracle镜像。只是想我会指出来

关于Docker 日志问题 : Logs are not created or displayed in Tomcat's logs folder in docker container,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48049656/

相关文章:

linux - 在Docker中为不同用户设置环境变量

javascript - 持续集成后在生产服务器中使用 Webpack 处理环境变量的两种方法

linux - Powershell 模块不会为 Linux 容器自动加载

Ansible:在容器创建期间获取 docker 容器输出

ruby-on-rails - 为 ruby​​ on rails 应用程序生成 WAR 文件

docker - Docker中的集群是什么?

docker - Docker Swarm集群:守护进程

docker - 如何在docker-compose中通知 `restart: on-failure`错误?

java - 如何从 war 中运行应用程序?

java - Spring Boot 根 Controller 无法在 Tomcat WAR 上运行