如何在 Docker 容器内列出挂载的卷。

25

我想列出所有已挂载卷的容器目录。

即,能够获取与以下命令类似的信息:

docker inspect --format "{{ .Volumes }}" <self>

但在容器内部并没有安装docker

我尝试了cat /proc/mounts,但是我找不到适当的过滤器。


我的意思是不需要在内部容器中安装和运行Docker,因为这相当于将sudo权限授予外部主机的内部容器。 - Leo Gallucci
2
在容器内部实际上没有任何方式可以识别Docker卷挂载(除非暴露访问Docker api的权限)。 - larsks
2
你可以在运行 docker run 命令时“作弊”,通过添加环境变量列表来使用 --env-file=[] Read in a file of environment variables(参见文档 https://docs.docker.com/reference/commandline/cli/#run),但是请注意,只有当你将其提供给容器时,容器才能发现它。 - user2915097
1
为什么?Docker 的整个重点在于将存储卷、网络端口和容器链接从容器化应用程序中抽象出来。这就是使 Docker 容器具有可移植性的原因。 - Mark O'Connor
1
没有完美的抽象,有时你只需要做一些自定义的事情。在这种情况下,我想为所有共享卷修复权限,因为这个问题仍然存在:使uid和gid可配置,这个想法来自Hamy社区wiki我的代码:https://github.com/elgalu/docker-selenium/blob/dfecfc0d485d25199101e480e4ad18a0e58a1cbf/bin/start.sh#L366 - Leo Gallucci
显示剩余2条评论
5个回答

14

(编辑 - 在 Mac 上可能不再适用) 如果你的 Docker 主机是 OS X,则挂载的卷将是 osxfs 类型(或 fuse.osxfs)。您可以运行

mount | grep osxfs | awk '{print $3}'

并获取所有已挂载卷的列表。

如果您的 Docker 主机是 Linux(至少 Ubuntu 14+,可能还有其他发行版),则所有卷似乎都在 /dev 目录下,但不存在于容器的 /dev 文件系统中。这些卷将位于 /etc/resolv.conf/etc/hostname/etc/hosts 旁边。如果要开始执行 mount | grep ^/dev,然后过滤掉 ls /dev/* 中的任何文件,并过滤掉上述列出的三个文件,则应该剩下主机卷。

mount | grep ^/dev/ | grep -v /etc | awk '{print $3}'

我的猜测是具体情况可能会因 Linux 而异。虽然不理想,但仍然有可能弄清楚。


可以在我的Ubuntu主机和虚拟机上运行。这正是我所需要的。谢谢! - Leo Gallucci
这个答案在发布时可能是正确的,但自那以后似乎情况已经发生了变化:在macOS 10.14 Mojave上运行Docker,并且一个示例容器内的所有挂载都不是osxfs类型:mount | sed -E -e 's|.*type ([^ ]+).*|\1|g' | sort | uniq | xargs打印出cgroup devpts ext4 mqueue overlay proc sysfs tmpfs - ssc
@ssc 我没有任何验证的方法,所以我会相信你的话。 - Ryan Calhoun

3
假设您想从 Linux 容器内部检查已挂载的卷,可以在 /etc/mtab 中查找以 "/dev" 开头的条目,并删除 /etc 条目。"最初的回答"
$ grep "^/dev" /etc/mtab | grep -v " \/etc/"

/dev/nvme0n1p1 /var/www/site1 ext4 rw,relatime,discard,data=ordered 0 0
/dev/nvme0n1p1 /var/www/site2 ext4 rw,relatime,discard,data=ordered 0 0

1
正如你从许多评论中所读到的,容器最初只是一部分受限制的、保留的资源,完全与机器的其余部分隔离开来。它不知道自己是一个Docker,在容器内部,一切都表现得像一个独立的机器。有点像矩阵,我想;)
您可以访问主机机器的内核和其资源,但再次仅限于过滤出的一组。这是通过Unix/Linux内核附带的神奇"cgroups"功能完成的。
现在好消息是:有多种方法可以向您的Docker提供信息,但这是您必须自己提供和构建的。
最简单且最强大的方法是将位于主机上的Unix套接字挂载到容器内部的相同位置/var/run/docker.sock。这样,当您在容器内使用Docker客户端时,您直接与主机上的Docker引擎通信。
然而,伴随着强大的力量而来的是伟大的责任。这是一个不错的设置,但并不是非常安全。一旦有人成功进入您的Docker,他就以这种方式拥有了对主机系统的根访问权限。
更好的方式是通过环境设置提供挂载列表,或者依靠一些虚构的约定来预测挂载点。
(您是否意识到有一个参数用于挂载,可以为您的 Docker 中的挂载点提供别名?)

0

您可能正在寻找的是docker exec命令。

这将允许您在现有容器内运行任意命令。

例如:

docker exec -it <mycontainer> bash

当然,无论您运行什么命令,它都必须存在于容器文件系统中。

#docker  cp  >>>> Copy files/folders between a container and the local filesystem
docker cp [OPTIONS] CONTAINER:SRC_PATH DEST_PATH
docker cp [OPTIONS] SRC_PATH CONTAINER:DEST_PATH

复制整个文件夹:

docker cp ./src/build b081dbbb679b:/usr/share/nginx/html

注意 - 这将会把构建目录复制到容器的.../nginx/html/目录中,只复制文件夹中存在的文件:
docker cp ./src/build/ b081dbbb679b:/usr/share/nginx/html

注意 - 这将复制容器中构建目录的内容到…./nginx/html/ directory

Docker 存储选项:

卷存储在由Docker管理的主机文件系统的一部分中(在Linux上为/var/lib/docker/volumes/)。非Docker进程不应修改此文件系统的此部分。卷是在Docker中持久保存数据的最佳方式。
创建卷时,它存储在Docker主机上的目录中。当您将卷挂载到容器中时,该目录就会被挂载到容器中。这类似于绑定挂载的工作方式,但是卷由Docker管理,并且与主机机器的核心功能隔离。
给定的卷可以同时挂载到多个容器中。当没有正在运行的容器使用卷时,该卷仍然可供Docker使用,并且不会自动删除。您可以使用docker volume prune命令删除未使用的卷。
挂载卷时,它可以是命名的或匿名的。当首次将匿名卷挂载到容器中时,它们不会被赋予显式名称,因此Docker会为它们分配一个随机名称,在给定的Docker主机中保证唯一性。除了名称外,命名和匿名卷的行为方式相同。
卷还支持卷驱动程序的使用,允许您在远程主机或云提供商等其他可能性上存储数据。
绑定挂载可以存储在主机系统的任何位置。它们甚至可以是重要的系统文件或目录。Docker主机或Docker容器上的非Docker进程随时可以修改它们。
自Docker早期以来就可用。与卷相比,绑定挂载具有有限的功能。当您使用绑定挂载时,主机机器上的文件或目录会被挂载到容器中。文件或目录由其在主机机器上的完整路径引用。文件或目录不需要已经存在于Docker主机上。如果尚不存在,则会按需创建。绑定挂载非常高效,但是它们依赖于主机机器的文件系统具有特定的目录结构。如果您正在开发新的Docker应用程序,请考虑改用命名卷。您无法使用Docker CLI命令直接管理绑定挂载。
使用绑定挂载的一个副作用(好的或坏的)是,您可以通过在容器中运行的进程更改主机文件系统,包括创建、修改或删除重要的系统文件或目录。这是一种强大的能力,可能会产生安全影响,包括影响主机系统上的非Docker进程。
tmpfs挂载仅存储在主机系统的内存中,并且永远不会写入主机系统的文件系统。
tmpfs挂载不会在Docker主机或容器内持久保存。它可以在容器的生命周期内被容器使用,以存储非持久状态或敏感信息。例如,在内部,Swarm服务使用tmpfs挂载将秘密挂载到服务的容器中。
如果您需要指定卷驱动程序选项,则必须使用--mount。 -v或--volume:由三个字段组成,由冒号字符(:)分隔。这些字段必须按正确顺序排列,并且每个字段的含义不是立即明显的。 对于命名卷,第一个字段是卷的名称,在给定的主机机器上是唯一的。对于匿名卷,省略第一个字段。 第二个字段是文件或目录在容器中将被挂载的路径。 第三个字段是可选的,并且是逗号分隔的选项列表,例如

0
以下命令似乎在Unix和MacOs上都可以工作 grep overlay /etc/mtab | sed 's#.*/#/#;s# .*##'

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接