繁体   English   中英

根据容器id查找docker文件路径

[英]Find docker file path according to container id

我想将 Docker 容器日志下载到我的本地。 我知道我的容器的容器 ID。

现在,我使用df -h来查找 docker 文件路径。 像这样/data/docker/overlay2/ea3e1ad0ccdee0e41d83722dfc6bf913250abd57918fecabd1067736b3e44305/merged 但是我有多个容器,很难知道我的容器的文件路径。

我怎么能根据我的容器 ID 知道ea3e1ad0ccdee0e41d83722dfc6bf913250abd57918fecabd1067736b3e44305

您可以使用docker inspect找到与容器关联的图像层。

可能有更简洁的解决方案,但我能够在xargsjq帮助下找到容器 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

您可以使用带有--no-trunc选项的docker ps命令,如下所示:

docker ps -a --no-trunc

您只能看到容器 ID 的前十二位数字,因为默认情况下输出会被截断。

您可以像这样提取确切的合并目录(与容器 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM