[英]how to reconnect to a docker logs --follow where the log file was deleted
我有一個 docker 容器在磁盤空間有限的小型 AWS 實例中運行。 日志越來越大,所以我使用以下命令刪除了不斷增長的日志文件:
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
,但是在與應該生成日志的軟件交互時,我可以看到沒有任何事情發生。
有沒有辦法在不殺死(重新啟動)容器的情況下再次將打印恢復到日志文件中?
有沒有辦法在不殺死(重新啟動)容器的情況下再次將打印恢復到日志文件中?
是的,但這更像是一個技巧而不是真正的解決方案。 你不應該直接與/var/lib/docker
數據交互。 根據Docker 文檔:
主機文件系統的一部分 [which] 由 Docker (Linux 上的
/var/lib/docker/volumes/
)管理。 非 Docker 進程不應修改文件系統的這一部分。
為了使這個技巧起作用,您需要在首次運行我們的容器之前配置您的Docker 守護程序以在停機期間保持容器活動。 例如,通過將/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 守護進程重新啟動時,它可能以某種方式嘗試從仍然活動的進程stdout
和stderr
重新讀取並將 output 重定向到我們的日志文件(因此重新創建它)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.