V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Dffcc
V2EX  ›  Docker

Docker attach 问题

  •  
  •   Dffcc · 284 天前 · 811 次点击
    这是一个创建于 284 天前的主题,其中的信息可能已经有所发展或是发生改变。

    前提:

    Docker run --name mytom -p 8081:8080 -it tomcat:8.5.49

    Docker attach tomcat

    提问 1:

    似乎只有起停进程(例如按 ctrl+c 或是 docker start mytom)才会有日誌,为何点击 Tomcat 所服务的网站,却没有 logs 透过 Docker attach tomcat 输出呢?

    问了 Chatgpt4.0 后,依然给我奇怪的答案:

    对于默认的 catalina.sh run ,Tomcat 通常会将日志写入到 logs/catalina.out 文件中,而不是输出到标准输出( STDOUT )。这意味着,即使你使用 docker attach 或 docker logs ,也看不到那些保存在 logs/catalina.out 文件中的日志内容。 如果你希望让 Tomcat 把日志输出到 STDOUT (从而让你通过 docker attach 或 docker logs 查看),你需要修改 Tomcat 的日志配置。

    提问 2:

    但事实就是起停进程会被 attach 输出,而 Docker attach 会记录标准输出( STDOUT ),哪里有错呢?

    9 条回复    2024-03-13 09:46:48 +08:00
    LemonPrefect
        1
    LemonPrefect  
       283 天前
    catalina 有多种日志,在 stdout 中看到的是 catalina 的启停日志,而不是 Tomcat 的访问日志。对于 Tomcat 访问日志来说,其默认配置如下,输出到文件中。

    ![]( https://img.erpweb.eu.org/imgs/2024/03/58da92e98313b2a8.png)

    catalina 启动的日志是由启动脚本决定输出到 STDOUT 中的,与 Tomcat 的访问日志无关。如果你希望将访问日志输出到 STDOUT 中,可以修改 server.xml 来实现。
    Dffcc
        2
    Dffcc  
    OP
       283 天前
    @LemonPrefect

    问题是如何从 Tomcat 的 Dockerfile 中,找到 STAOUT 相关文件,你怎么知道要输入图片上的指令呢?

    cd/comf
    ls
    grep server.xml
    cat server.xml|grep

    https://github.com/docker-library/tomcat/blob/2922893bc6ccc52af5b663972b5918ce5fb9a841/8.5/jdk21/corretto-al2/Dockerfile
    @LemonPrefect
    LemonPrefect
        3
    LemonPrefect  
       282 天前 via Android
    @Dffcc 这与 Docker 无关但与 Tomcat 有关。server.xml 是 Tomcat 提供的配置文件。

    请参阅: https://tomcat.apache.org/tomcat-8.5-doc/config/context.html#Introduction
    LemonPrefect
        4
    LemonPrefect  
       282 天前 via Android
    PS. 因此你无法直接在 Dockerfile 中找到此文件,对于 Docker 来说他就是上层服务 src 。
    Dffcc
        5
    Dffcc  
    OP
       282 天前
    @LemonPrefect

    https://www.bilibili.com/video/BV1qN411K7W3?t=202.0&p=52

    这边讲师有说 Docker logs mytom3 ,没出现内容而离开的原因是因为用 bash 指令,跟这里的 Docker attach tomcat 是不是一样的道理,一切都看 CMD 指令?
    LemonPrefect
        6
    LemonPrefect  
       281 天前 via Android
    @Dffcc logs 输出的内容只取决于 STDOUT ,无论什么进程向 STDOUT 输出了,logs 就显示。这里显示了两遍 bash prompt ,是因为容器已经停止了,而在停止的最后时刻,留下了由原有的 entrypoint 输出的 prompt 。根本原因与是不是使用的 bash 一点关系都没有,如果这里的 entrypoint 换成我写的专门启动 catalina 的二进制程序,那你就会看到他输出的 log 。
    Dffcc
        7
    Dffcc  
    OP
       281 天前 via iPhone
    @LemonPrefect 不是 entrypoint ,应该是看 CMD 指令,我的意思是 STDOUT 指令也是看 CMD 吗? 还是只能像 Tomcat 从官网看?
    LemonPrefect
        8
    LemonPrefect  
       281 天前 via Android
    @Dffcc 看 entrypoint ,如果我实现的 entrypoint 是一个从来不向标准输出流输出任何东西的二进制文件,那你将看不见任何输出,无论你使用什么指令。
    Dffcc
        9
    Dffcc  
    OP
       280 天前 via iPhone
    @LemonPrefect 有点难理解,我需要学习更多相关的知识,谢谢你☺️
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1025 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 22ms · UTC 19:20 · PVG 03:20 · LAX 11:20 · JFK 14:20
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.