Docker日志问题:日志未在docker容器中的Tomcat日志文件夹中创建或显示

时间:2018-01-01 12:28:45

标签: docker docker-container war

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

中看不到任何日志文件

任何人都可以帮我解决我们如何看到tomcat日志,例如localhost.logs / catalina.logs / manager.logs等

我的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

3 个答案:

答案 0 :(得分:2)

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

如果在2018年你还需要java 6,那么你需要用FROM java:6-jreofficial pageFROM openjdk:6-jre的建议替换FROM行,这很危险。我还强烈建议至少使用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,您应该通过执行{{{{{{{ 1}}(资本F)

tail -F - 在startup.sh退出之前,tail永远不会启动。更好的方法是在启动tomcat服务器之前在startup.sh中执行startup.sh && tail。那样尾巴将在后台运行。

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

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

tail -F $CATALINA_HOME/logs/catalina.out &

注意:此dockerfile示例省略了一些最佳做法,例如在与执行apt-get update相同的运行命令中删除apt缓存。

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

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

P.S。:为了确保tomcat存在要写入的日志文件夹,执行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"] 可能是个好主意。

P.P.S。: java基础图像实际上是使用openjdk而不是oracle。只是想我已经指出了

答案 1 :(得分:0)

您应该检查tomcat日志记录设置。 JRE中的默认logging.properties指定将日志记录路由到System.err的ConsoleHandler。 Apache Tomcat中的默认conf / logging.properties还添加了几个写入文件的FileHandler。

示例logging.properties文件放在$ CATALINA_BASE / conf:

newKittiesReceived: (Kitty) -> Unit

将servlet-examples Web应用程序放在Web应用程序内的WEB-INF / classes中的logging.properties示例:

handlers = 1catalina.org.apache.juli.FileHandler, \
           2localhost.org.apache.juli.FileHandler, \
           3manager.org.apache.juli.FileHandler, \
           java.util.logging.ConsoleHandler

.handlers = 1catalina.org.apache.juli.FileHandler, java.util.logging.ConsoleHandler

############################################################
# Handler specific properties.
# Describes specific configuration info for Handlers.
############################################################

1catalina.org.apache.juli.FileHandler.level = FINE
1catalina.org.apache.juli.FileHandler.directory = ${catalina.base}/logs
1catalina.org.apache.juli.FileHandler.prefix = catalina.

2localhost.org.apache.juli.FileHandler.level = FINE
2localhost.org.apache.juli.FileHandler.directory = ${catalina.base}/logs
2localhost.org.apache.juli.FileHandler.prefix = localhost.

3manager.org.apache.juli.FileHandler.level = FINE
3manager.org.apache.juli.FileHandler.directory = ${catalina.base}/logs
3manager.org.apache.juli.FileHandler.prefix = manager.
3manager.org.apache.juli.FileHandler.bufferSize = 16384

java.util.logging.ConsoleHandler.level = FINE
java.util.logging.ConsoleHandler.formatter = java.util.logging.SimpleFormatter


############################################################
# Facility specific properties.
# Provides extra control for each logger.
############################################################

org.apache.catalina.core.ContainerBase.[Catalina].[localhost].level = INFO
org.apache.catalina.core.ContainerBase.[Catalina].[localhost].handlers = \
   2localhost.org.apache.juli.FileHandler

org.apache.catalina.core.ContainerBase.[Catalina].[localhost].[/manager].level = INFO
org.apache.catalina.core.ContainerBase.[Catalina].[localhost].[/manager].handlers = \
   3manager.org.apache.juli.FileHandler

# For example, set the org.apache.catalina.util.LifecycleBase logger to log
# each component that extends LifecycleBase changing state:
#org.apache.catalina.util.LifecycleBase.level = FINE

https://tomcat.apache.org/tomcat-6.0-doc/logging.html

的更多信息

答案 2 :(得分:0)

除非我们安装它,否则我们无法在Docker容器中看到日志。

构建Dockerfile: -

docker build -t tomcat

运行Dockerfile映像: -

docker run -p 8080:8080 tomcat

将docker容器中存在的tomcat日志复制到已安装的容器中: -

运行此cmd以安装容器:

                                                1stpath    :      2ndpath
docker run \\-d \\-p 8085:8085 \\-v  /usr/local/tomcat/logs:/usr/local/tomcat/logs  \tomcat

或只是

docker run \\-d \\-v  /usr/local/tomcat/logs:/usr/local/tomcat/logs  \tomcat
  

1st: - / usr / local / tomcat / logs:root目录的路径:我们要复制的位置   日志或目的地

     

2nd: - / usr / local / tomcat / logs:tomcat / logs文件夹的路径   泊坞容器

tomcat:-name of image

如果端口忙,则需要更改端口

现在容器已安装

获取容器运行列表:docker ps -a

现在获取最新创建的容器的容器ID:

docker exec -it < mycontainer > bash 

然后我们可以通过

查看日志
    cd /usr/local/tomcat/logs

    usr/local/tomcat/logs# less  Log Name Here   

这样可以复制root上的docker容器中的任何文件夹: -

docker cp <containerId>:/file/path/within/container /host/path/target