You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何列出已停止Docker容器内指定目录的文件?

如何列出已停止Docker容器内指定目录的文件

我完全懂你的痛点——容器停了之后docker exec就用不了,又不知道动态生成的文件名,没法直接用docker cp。别担心,这里有两个靠谱的方法能解决这个问题:

方法一:用docker export导出后查看文件系统

这个方法不需要启动容器,直接把整个容器的文件系统导出成tar包,然后用tar命令筛选查看指定目录:

  1. 先导出容器的文件系统到本地tar文件:
    docker export <容器ID或名称> > container_backup.tar
    
  2. 然后用tar tf命令查看指定目录下的所有文件(替换<目标目录>为你要找的路径,比如/app/generated-files):
    tar tf container_backup.tar <目标目录>
    
    比如你要查看/app/logs目录,命令就是:
    tar tf container_backup.tar /app/logs
    
    这样就能列出该目录下所有动态生成的文件名了,之后你就可以用docker cp复制具体文件了。

方法二:挂载容器存储目录到临时容器

Docker容器的文件系统实际存储在宿主机的特定路径下,我们可以找到这个路径,然后用一个临时容器挂载它来查看文件:

  1. 先获取容器的合并文件系统路径(这个路径是宿主机上的真实路径):

    docker inspect -f '{{ .GraphDriver.Data.MergedDir }}' <容器ID或名称>
    

    执行后会返回类似/var/lib/docker/overlay2/abc123def456/merged这样的路径。

  2. 启动一个临时的busybox容器,把上面得到的路径挂载进去,然后查看指定目录:

    docker run --rm -v <步骤1得到的路径>:/container-fs busybox ls -l /container-fs<目标目录>
    

    举个例子,如果MergedDir是/var/lib/docker/overlay2/abc123def456/merged,目标目录是/app/generated-files,命令就是:

    docker run --rm -v /var/lib/docker/overlay2/abc123def456/merged:/container-fs busybox ls -l /container-fs/app/generated-files
    

为什么docker exec不行?

你提到的运行状态下可用的命令应该是docker exec,但这个命令依赖容器处于运行状态——容器停止后,Docker不会为它分配执行环境,所以docker exec自然失效。上面的两种方法都是直接访问容器的底层文件系统,不需要启动容器,完美适配你的场景。

内容的提问来源于stack exchange,提问作者Nathan

火山引擎 最新活动