【问题标题】:Can't use `systemd-cat` inside Docker container不能在 Docker 容器中使用`systemd-cat`
【发布时间】:2017-11-01 15:13:14
【问题描述】:

我正在尝试从我的容器内测试到 journald 的日志记录。我希望它在容器内工作,因为我们的构建系统在容器内运行。我需要测试一个使用journalctl 的脚本,并且我需要生成输出以供解析。测试脚本需要在容器中运行。

我正在像这样启动我的容器:

$ docker run --rm -it -v $(pwd):/home/edge -w /home/edge --log-driver=journald ubuntu /bin/bash 
root@78b56defde31:/home/edge# systemd-cat -t overflow ls /etc
Failed to create stream fd: No such file or directory

如果我在 Debian 主机上运行相同的命令,它可以工作:

$ systemd-cat -t overflow ls /etc
$ sudo journalctl | grep overflow
Nov 01 08:09:53 nanode64 overflow[9037]: acpi
Nov 01 08:09:53 nanode64 overflow[9037]: adduser.conf
Nov 01 08:09:53 nanode64 overflow[9037]: adjtime
Nov 01 08:09:53 nanode64 overflow[9037]: aliases
Nov 01 08:09:53 nanode64 overflow[9037]: alternatives
Nov 01 08:09:53 nanode64 overflow[9037]: anacrontab
Nov 01 08:09:53 nanode64 overflow[9037]: apache2
Nov 01 08:09:53 nanode64 overflow[9037]: apg.conf
Nov 01 08:09:53 nanode64 overflow[9037]: apm
Nov 01 08:09:53 nanode64 overflow[9037]: apt
...

【问题讨论】:

    标签: docker logging systemd


    【解决方案1】:

    除了bash 之外,您的容器内没有任何东西在运行。容器内没有运行journald,因此没有可供systemd-cat 通信的套接字。我怀疑您尝试使用systemd-cat 可能源于对journald 日志驱动程序工作原理的误解。

    您正在使用 Docker 的 journald 日志记录驱动程序,这意味着您的容器输出到 stdout/stderr 的任何内容都将显示在您的 host 日志中。也就是说,如果你要运行:

    docker run --rm -v $(pwd):/home/edge -w /home/edge --log-driver=journald ubuntu echo this is a test
    

    你会在主机上看到:

    # journalctl -fl
    ...
    Nov 01 11:45:08 lkellogg-pc0dzzve dockerd[3736]: this is a test
    ...
    

    如果您要使用 -o verbose 显示该消息,您会看到它实际上包含各种其他元数据,例如容器 ID 和容器名称:

    # journalctl -fl -o verbose MESSAGE='this is a test'
    Wed 2017-11-01 11:48:02.002147 EDT [s=9a99c0d26c3548a2ba6a6416bc37094c;i=15c9cce1;b=3f2b2d45203c485f9fa4373148c81925;m=219ad310e0d;t=55cedcbef19b3;x=6f1641d7b8ebf7ee]
        PRIORITY=6
        _TRANSPORT=journal
        _UID=0
        _GID=0
        _SYSTEMD_SLICE=system.slice
        _BOOT_ID=3f2b2d45203c485f9fa4373148c81925
        _MACHINE_ID=229916fba5b54252ad4d08efbc581213
        _HOSTNAME=lkellogg-pc0dzzve
        _CAP_EFFECTIVE=3fffffffff
        _PID=3736
        _COMM=dockerd
        _EXE=/usr/bin/dockerd
        _CMDLINE=/usr/bin/dockerd -G docker --dns 172.23.254.1 --log-driver journald -s overlay2
        _SYSTEMD_CGROUP=/system.slice/docker.service
        _SYSTEMD_UNIT=docker.service
        _SELINUX_CONTEXT=system_u:system_r:unconfined_service_t:s0
        MESSAGE=this is a test
        CONTAINER_ID=5d20a635fcff
        CONTAINER_ID_FULL=5d20a635fcff5c57212a65d5d0ebd77f3fd9529a8fd4fe6b718238877ecf5173
        CONTAINER_NAME=optimistic_easley
        CONTAINER_TAG=5d20a635fcff
        _SOURCE_REALTIME_TIMESTAMP=1509551282002147
    

    【讨论】:

    • 我不确定这是否能解决我的问题,但我可以从容器内部连接到主机上的journald 套接字吗?
    • 当然,您可以通过将 -v /run/systemd/journal:/run/systemd/journal 添加到您的 docker run 命令行来公开日志套接字,但在大多数情况下,您最好的选择就是回复标准的 docker 日志记录行为。
    • 我需要从容器内部访问日志。我可能弄错了,但我认为我不能使用“标准 docker 日志记录行为”来做到这一点。
    • 也许您可以更新您的问题以显示您实际想要做什么?这将有助于确保答案是有用的。在我之前的评论中公开日志套接字将允许您登录 to 日志,但不会让您访问日志。
    • 我已经更新了问题。如果还不清楚,请告诉我。
    猜你喜欢
    • 1970-01-01
    • 2016-06-09
    • 2018-08-26
    • 1970-01-01
    • 2017-01-03
    • 2018-09-29
    • 1970-01-01
    • 1970-01-01
    • 2014-09-07
    相关资源
    最近更新 更多