【问题标题】:Tomcat, Docker, Logging, and STDOUT?Tomcat、Docker、日志和标准输出?
【发布时间】:2018-05-22 18:05:36
【问题描述】:

我在 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”启动容器 MYAPP 之后立即--name MYAPP MYAPP" /var/log/MYAPP.log 的内容会打印到标准输出吗?

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

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

【问题讨论】:

    标签: docker tomcat logging 12factor


    【解决方案1】:

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

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

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

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

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

    CMD /usr/local/tomcat/bin/catalina.sh start && tail -f /usr/local/MYAPP.log
    

    【讨论】:

    • 哦,谢谢,我现在看到了 RUN 和 CMD 之间的区别,很有趣!我试过但现在它说: 成功构建 3a1ccf47c08c 成功标记 MYAPP:latest 使用 CATALINA_BASE: /usr/local/tomcat 使用 CATALINA_HOME: /usr/local/tomcat 使用 CATALINA_TMPDIR: /usr/local/tomcat/temp 使用 JRE_HOME: /docker- java-home/jre 使用 CLASSPATH:/usr/local/tomcat/bin/bootstrap.jar:/usr/local/tomcat/bin/tomcat-juli.jar Tomcat 启动。尾部:无法打开“/usr/local/MYAPP.log”进行阅读:没有这样的文件或目录尾部:没有剩余文件
    • 错误消息“没有这样的文件或目录”似乎很清楚。可能在您运行tail -f 时该文件尚未创建。考虑改用tail -F,它应该等待文件出现。
    • 谢谢,帮了大忙!
    • 这不是真的推荐。如果您只是使用catalina.sh run 而不是start,那么日志将被重定向到标准输出,您会发现它们很容易使用docker工具访问(docker logs ...)
    • 这个答案的真正意义在于RUN 和CMD 之间的区别。
    【解决方案2】:

    好的,您的 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/

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        【解决方案4】:

        在这里找到了一个不错的方法: 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!

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

        【讨论】:

        • 这对我有用。我不确定这在规模上的性能如何 - 如果我发现任何规模问题,我会在这里发回。
        【解决方案5】:

        以下在 Tomcat 9.0.37 中为我工作:

        不要使用 ./statup.sh,使用 ./catalina.sh run 启动tomcat服务器。

        【讨论】:

          【解决方案6】:

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

          更多详情见https://12factor.net/logs

          【讨论】:

          • 一旦所有内容都路由到 stdout/stderr 日志可通过docker logs -f &lt;container_name&gt;获得
          • @DJO3,我只是将日志挂载到 docker-compose 中的 tmpfs。重启后也会丢失:tmpfs: - /var/log
          猜你喜欢
          • 2020-10-12
          • 1970-01-01
          • 2016-01-16
          • 2016-07-13
          • 2020-07-10
          • 2019-02-11
          • 1970-01-01
          • 1970-01-01
          • 2017-04-13
          相关资源
          最近更新 更多