gpt4 book ai didi

amazon-web-services - 如何重新连接到 docker logs --follow 日志文件被删除的位置

转载 作者:行者123 更新时间:2023-12-02 17:52:45 25 4
gpt4 key购买 nike

我有一个在磁盘空间有限的小型 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 ,但是在与应该生成日志的软件进行交互时,我可以看到什么也没有发生。
有没有办法在不杀死(重新启动)容器的情况下再次将打印保存到日志文件中?

最佳答案

Is there any way to rescue the printing into the log file again without killing (rebooting) the containers?


是的,但这与其说是真正的解决方案,不如说是一种技巧。 您永远不应该与 /var/lib/docker 互动数据直接 .根据 Docker docs :

part of the host filesystem [which] is managed by Docker (/var/lib/docker/volumes/ on Linux). Non-Docker processes should not modify this part of the filesystem.



为了让这个技巧起作用,你需要配置你的 Docker Daemon to keep containers alive during downtime在第一次运行我们的容器之前。例如,通过设置您的 /etc/docker/daemon.json和:
{
"live-restore": true
}
这需要 Daemon 重启,例如 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并将输出重定向到我们的日志文件(因此重新创建它)

关于amazon-web-services - 如何重新连接到 docker logs --follow 日志文件被删除的位置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63282142/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com