【问题标题】:how to reconnect to a docker logs --follow where the log file was deleted如何重新连接到 docker logs --follow 删除日志文件的位置
【发布时间】:2020-08-06 10:58:54
【问题描述】:

我有一个在磁盘空间有限的小型 AWS 实例中运行的 docker 容器。日志越来越大,所以我使用以下命令删除了不断增长的日志文件:

sudo -s -H
find /var -name "*json.log" | grep docker | xargs -r rm
journalctl --vacuum-size=50M

现在我想查看一个正在运行的 docker 容器的行为,但它声称日志文件已消失(来自上面的 rm 命令):

ubuntu@x-y-z:~$ docker logs --follow name_of_running_docker_1
error from daemon in stream: Error grabbing logs: open /var/lib/docker/containers/d9562d25787aaf3af2a2bb7fd4bf00994f2fa1a4904979972adf817ea8fa57c3/d9562d25787aaf3af2a2bb7fd4bf00994f2fa1a4904979972adf817ea8fa57c3-json.log: no such file or directory

我希望能够再次看到正在运行的容器中发生了什么,所以我尝试了:

sudo touch /var/lib/docker/containers/d9562d25787aaf3af2a2bb7fd4bf00994f2fa1a4904979972adf817ea8fa57c3/d9562d25787aaf3af2a2bb7fd4bf00994f2fa1a4904979972adf817ea8fa57c3-json.log

又是docker follow,但在与应该生成日志的软件交互时,我可以看到什么都没有发生。

有什么方法可以在不杀死(重新启动)容器的情况下再次将打印恢复到日志文件中?

【问题讨论】:

    标签: amazon-web-services docker logging


    【解决方案1】:

    有什么方法可以在不杀死(重新启动)容器的情况下再次将打印恢复到日志文件中?

    是的,但这更像是一种技巧,而不是真正的解决方案。 您不应该直接与/var/lib/docker 数据交互。根据Docker docs

    主机文件系统的一部分 [which] 由 Docker 管理(Linux 上的/var/lib/docker/volumes/)。非 Docker 进程不应修改文件系统的这一部分。


    要使这个技巧起作用,您需要在首次运行我们的容器之前配置您的Docker Daemon to keep containers alive during downtime。例如,通过将/etc/docker/daemon.json 设置为:

    {
      "live-restore": true
    }
    

    这需要重启守护进程,例如sudo systemctl restart docker

    然后创建一个容器并删除它的.log文件:

    $ docker run --name myhttpd -d httpd:alpine
    $ sudo rm $(docker inspect myhttpd -f '{{ .LogPath }}')
    
    # Docker is not happy
    $ docker logs myhttpd
    error from daemon in stream: Error grabbing logs: open /var/lib/docker/containers/xxx-json.log: no such file or directory
    

    重启守护进程(使用实时恢复),这将导致 Docker 以某种方式重新管理我们的容器并创建我们的日志文件。但是,删除日志文件之前生成的所有日志都会丢失。

    $ sudo systemctl restart docker
    $ docker logs myhttpd # works! and log file is created back
    

    注意:这不是一个记录或官方的 Docker 功能,只是我在使用 Docker 19.03 的实验中观察到的一种行为。它可能不适用于其他 Docker 版本

    启用实时恢复后,即使 Docker 守护进程停止,我们的容器进程也会继续运行。在 Docker 守护进程重新启动时,它可能会以某种方式尝试从仍然活动的进程 stdoutstderr 重新读取并将输出重定向到我们的日志文件(因此重新创建它)

    【讨论】:

    • 我猜如果没有设置实时恢复,那么我们就会遇到一个空日志。但很高兴知道这可以解决问题。
    猜你喜欢
    • 1970-01-01
    • 2021-07-14
    • 1970-01-01
    • 2021-01-10
    • 1970-01-01
    • 2021-11-24
    • 1970-01-01
    • 1970-01-01
    • 2016-07-12
    相关资源
    最近更新 更多