如何列出已停止Docker容器内指定目录的文件?
如何列出已停止Docker容器内指定目录的文件
我完全懂你的痛点——容器停了之后docker exec就用不了,又不知道动态生成的文件名,没法直接用docker cp。别担心,这里有两个靠谱的方法能解决这个问题:
方法一:用docker export导出后查看文件系统
这个方法不需要启动容器,直接把整个容器的文件系统导出成tar包,然后用tar命令筛选查看指定目录:
- 先导出容器的文件系统到本地tar文件:
docker export <容器ID或名称> > container_backup.tar - 然后用
tar tf命令查看指定目录下的所有文件(替换<目标目录>为你要找的路径,比如/app/generated-files):
比如你要查看tar tf container_backup.tar <目标目录>/app/logs目录,命令就是:
这样就能列出该目录下所有动态生成的文件名了,之后你就可以用tar tf container_backup.tar /app/logsdocker cp复制具体文件了。
方法二:挂载容器存储目录到临时容器
Docker容器的文件系统实际存储在宿主机的特定路径下,我们可以找到这个路径,然后用一个临时容器挂载它来查看文件:
先获取容器的合并文件系统路径(这个路径是宿主机上的真实路径):
docker inspect -f '{{ .GraphDriver.Data.MergedDir }}' <容器ID或名称>执行后会返回类似
/var/lib/docker/overlay2/abc123def456/merged这样的路径。启动一个临时的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




