我想列出作为已装载卷的所有容器目录。也就是说,为了能够得到类似的信息,我从
docker inspect --format "{{ .Volumes }}" <self>
但是从容器内并且没有在其中安装docker。我试过cat /proc/mounts,但我找不到合适的过滤器。
docker
cat /proc/mounts
slwdgvem1#
(EDIT- 这可能不再适用于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而异。不太理想,但至少可以理解。
mount | grep osxfs | awk '{print $3}'
/dev
/etc/resolv.conf
/etc/hostname
/etc/hosts
mount | grep ^/dev
ls /dev/*
mount | grep ^/dev/ | grep -v /etc | awk '{print $3}'
xuo3flqw2#
假设您想要检查哪些卷被挂载 * 从基于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
zf9nrax13#
正如您可以从许多评论中看到的那样,容器最初只不过是资源的一个受限制的保留部分,完全与机器的其余部分分离。它不知道自己是Docker,在容器内,一切都像是一台独立的机器。有点像黑客帝国,我猜;)您可以访问主机的内核及其资源,但仍然被限制为仅被过滤的集合。这是通过Unix/Linux内核附带的令人敬畏的“cgroups”功能来完成的。好消息是有多种方法可以向Docker提供信息,但这需要您自己提供和构建。最简单和最强大的方法是将位于/var/run/docker.sock主机上的Unix套接字挂载到容器内部的同一位置。这样,当你在容器中使用Docker客户端时,你直接与主机上的Docker引擎对话。然而,权力越大,责任越大。这是一个很好的设置,但它不是很安全。一旦有人设法进入你的docker,它就可以通过这种方式访问你的主机系统。更好的方法是通过环境设置提供挂载列表,或者坚持一些虚构的约定来预测挂载。(Do你意识到有一个用于挂载的参数,给予你的Docker里面的挂载一个别名吗?)
/var/run/docker.sock
kgqe7b3p4#
docker exec命令可能就是你要找的。这将允许您在现有容器中运行任意命令。例如:
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挂载将secret挂载到服务的容器中。如果需要指定卷驱动程序选项,则必须使用--mount。-v或--volume:由三个字段组成,以冒号(:)分隔。这些字段必须按正确的顺序排列,并且每个字段的含义并不明显。◦在命名卷的情况下,第一字段是卷的名称,并且在给定主机机器上是唯一的。对于匿名卷,将省略第一个字段。〇第二个字段是文件或目录将被挂载在容器中的路径。〇第三个字段是可选的,并且是逗号分隔的选项列表,诸如ro。下文将讨论这些选项。· --mount:由多个键值对组成,由逗号分隔,每个键值对由=元组组成。--mount语法比-v或--volume更详细,但键的顺序并不重要,标志的值更容易理解。o挂载的类型,可以是bind、volume或tmpfs。本主题讨论卷,因此类型始终为卷。o山的来源。对于命名卷,这是卷的名称。对于匿名卷,将省略此字段。可以指定为source或src。o目的地将文件或目录将被挂载到容器中的路径作为其值。可以指定为destination、dst或target。〇 readonly选项(如果存在的话)使得绑定挂载作为只读挂载到容器中。o volume-opt选项可以指定多次,它采用由选项名称及其值组成的键值对。
…./nginx/html/ directory
0aydgbwb5#
下面的命令似乎在Unix和MacOs上都可以工作grep overlay /etc/mtab | sed 's#.*/#/#;s# .*##'
grep overlay /etc/mtab | sed 's#.*/#/#;s# .*##'
5条答案
按热度按时间slwdgvem1#
(EDIT- 这可能不再适用于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而异。不太理想,但至少可以理解。
xuo3flqw2#
假设您想要检查哪些卷被挂载 * 从基于Linux的容器内 *,您可以在/etc/mtab中查找以“/dev”开头的条目,删除/etc条目
zf9nrax13#
正如您可以从许多评论中看到的那样,容器最初只不过是资源的一个受限制的保留部分,完全与机器的其余部分分离。它不知道自己是Docker,在容器内,一切都像是一台独立的机器。有点像黑客帝国,我猜;)
您可以访问主机的内核及其资源,但仍然被限制为仅被过滤的集合。这是通过Unix/Linux内核附带的令人敬畏的“cgroups”功能来完成的。
好消息是有多种方法可以向Docker提供信息,但这需要您自己提供和构建。
最简单和最强大的方法是将位于
/var/run/docker.sock
主机上的Unix套接字挂载到容器内部的同一位置。这样,当你在容器中使用Docker客户端时,你直接与主机上的Docker引擎对话。然而,权力越大,责任越大。这是一个很好的设置,但它不是很安全。一旦有人设法进入你的docker,它就可以通过这种方式访问你的主机系统。
更好的方法是通过环境设置提供挂载列表,或者坚持一些虚构的约定来预测挂载。
(Do你意识到有一个用于挂载的参数,给予你的Docker里面的挂载一个别名吗?)
kgqe7b3p4#
docker
exec
命令可能就是你要找的。这将允许您在现有容器中运行任意命令。
例如:
当然,无论您运行什么命令,容器文件系统中都必须存在。
复制整个文件夹:
注意-这将复制容器的.../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挂载将secret挂载到服务的容器中。
如果需要指定卷驱动程序选项,则必须使用--mount。-v或--volume:由三个字段组成,以冒号(:)分隔。这些字段必须按正确的顺序排列,并且每个字段的含义并不明显。◦在命名卷的情况下,第一字段是卷的名称,并且在给定主机机器上是唯一的。对于匿名卷,将省略第一个字段。〇第二个字段是文件或目录将被挂载在容器中的路径。〇第三个字段是可选的,并且是逗号分隔的选项列表,诸如ro。下文将讨论这些选项。· --mount:由多个键值对组成,由逗号分隔,每个键值对由=元组组成。--mount语法比-v或--volume更详细,但键的顺序并不重要,标志的值更容易理解。o挂载的类型,可以是bind、volume或tmpfs。本主题讨论卷,因此类型始终为卷。o山的来源。对于命名卷,这是卷的名称。对于匿名卷,将省略此字段。可以指定为source或src。o目的地将文件或目录将被挂载到容器中的路径作为其值。可以指定为destination、dst或target。〇 readonly选项(如果存在的话)使得绑定挂载作为只读挂载到容器中。o volume-opt选项可以指定多次,它采用由选项名称及其值组成的键值对。
0aydgbwb5#
下面的命令似乎在Unix和MacOs上都可以工作
grep overlay /etc/mtab | sed 's#.*/#/#;s# .*##'