[英]Find docker file path according to container id
我想将 Docker 容器日志下载到我的本地。 我知道我的容器的容器 ID。
现在,我使用df -h
来查找 docker 文件路径。 像这样/data/docker/overlay2/ea3e1ad0ccdee0e41d83722dfc6bf913250abd57918fecabd1067736b3e44305/merged
。 但是我有多个容器,很难知道我的容器的文件路径。
我怎么能根据我的容器 ID 知道ea3e1ad0ccdee0e41d83722dfc6bf913250abd57918fecabd1067736b3e44305
。
您可以使用docker inspect
找到与容器关联的图像层。
可能有更简洁的解决方案,但我能够在xargs
和jq
帮助下找到容器 ID。
docker ps -a -q | xargs docker inspect | jq '.[] | select(.GraphDriver.Data.LowerDir | contains("ea3e1ad0ccdee0e41d83722dfc6bf913250abd57918fecabd1067736b3e44305")) | .Id'
docker ps -a -q
获取所有容器 ID 的列表。xargs docker inspect
获取每个容器的详细信息。jq
搜索列表并返回引用GraphDriver
对象中图像层的任何容器的Id
。列出容器
docker ps
在存在日志的容器内导航。
docker exec -it ContainerId bash
在容器中找到您的日志
bash-4.2$ cd yourapplication/path/log/
退出容器
bash-4.2$ exit
复制到您的本地位置
docker cp edd5064178db:yourapplication/path/log/request.log /your/local/location
您可以像这样提取确切的合并目录(与容器 ID 不同):
$ docker inspect --format='{{json .GraphDriver.Data.MergedDir}}' container-id
"/var/lib/docker/overlay2/the-string-you-are-searching-for/merged"
docker logs
命令会将容器进程的 stdout 和 stderr 复制到它自己的 stdout 和 stderr,您可以从那里保存它们。 您还可以配置docker run
将日志发送到其他服务,例如本地 syslog 或某个地方的 logstash 安装(但这会使 docker docker logs
不再起作用)。
docker logs $CONTAINER_ID >$CONTAINER_ID.log 2>&1
如果它正在记录到一个文件,你可以docker cp
它
docker cp $CONTAINER_ID/usr/local/apache2/logs/access.log $CONTAINER_ID.access.log
但最好还是直接启动容器,并将主机目录绑定安装到日志目录,所以这不是问题
docker stop $CONTAINER_ID
docker rm $CONTAINER_ID
docker run -v $PWD/logs:/usr/local/apache2/logs ...
直接访问/var/lib/docker
通常不被认为是一个好主意。 该overlay2
目录有每个图像的和每个容器的文件系统的一部分,如果你的系统是使用“overlay2”存储驱动程序(用于两个AUFS和devicemapper是相当普遍的,并会保持对事物的不同的子目录)。
使用以下命令
docker inspect --format {{.Id}} "ContainerName"
您将看到容器安装 ID。
如果您没有将日志路由到任何云并存储在本地,则运行以下命令以获取 docker 为容器存储日志的文件位置 -
如果您知道容器 ID,则使用以下命令获取带有位置的文件名,然后您可以下载或任何您想做的事情 -
docker inspect --format={{.LogPath}} <ContainerID>
这个命令会给你像 /var/lib/docker/containers// 这样的位置
如果您有多个容器 /images 正在运行,请使用以下命令。
for i in $(docker images -q );do docker inspect $i |grep <the-string-you-are-searching-for> ;echo $i ;done
或者
for i in $(docker ps -aq );do docker inspect $i |grep <the-string-you-are-searching-for> ;echo $i ;done
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.