Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何从容器中列出Docker装入的卷_Docker_Mount_Inspect - Fatal编程技术网

如何从容器中列出Docker装入的卷

如何从容器中列出Docker装入的卷,docker,mount,inspect,Docker,Mount,Inspect,我想列出已装入卷的所有容器目录 也就是说,能够获得类似的信息,我从 docker inspect --format "{{ .Volumes }}" <self> docker-inspect——格式化“{.Volumes}” 但是从容器内部,并且没有安装docker 我尝试了cat/proc/mounts,但找不到合适的过滤器。从您的许多评论中可以看出,容器最初只是一个受限的、保留的资源部分,与机器的其余部分完全分离。它不知道自己是一个码头工人,而在容器内,一切都像是一台单独的

我想列出已装入卷的所有容器目录

也就是说,能够获得类似的信息,我从

docker inspect --format "{{ .Volumes }}" <self>
docker-inspect——格式化“{.Volumes}”
但是从容器内部,并且没有安装
docker


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

从您的许多评论中可以看出,容器最初只是一个受限的、保留的资源部分,与机器的其余部分完全分离。它不知道自己是一个码头工人,而在容器内,一切都像是一台单独的机器。我猜有点像矩阵;)

您可以访问主机的内核及其资源,但又被限制为一个过滤掉的集合。这是通过Unix/Linux内核附带的很棒的“cgroups”功能实现的

现在好消息是:您可以通过多种方式向Docker提供信息,但这是您必须自己提供和构建的

最简单、最强大的方法是将主机上位于
/var/run/docker.sock
的Unix套接字装载到容器内部的同一位置。这样,当您在容器中使用Docker客户端时,您直接与主机上的Docker引擎进行对话

然而,强大的力量带来巨大的责任。这是一个很好的设置,但不是很安全。一旦有人设法进入您的docker,它就可以通过这种方式从根目录访问您的主机系统

更好的方法是通过环境设置提供挂载列表,或者坚持一些虚构的约定来预测挂载

(您是否意识到有一个装载参数,为Docker内部的装载提供别名?

(编辑-这可能不再适用于Mac)如果Docker主机是OSX,则装载的卷将是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而异。不太理想,但至少有可能找到答案。

docker
exec
命令可能就是您想要的

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

例如:

docker exec -it <mycontainer> bash
要复制完整文件夹,请执行以下操作:

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管理(/var/lib/Docker/Volumes/在Linux上)。非Docker进程不应修改文件系统的这一部分。卷是在Docker中保存数据的最佳方式

创建卷时,它存储在Docker主机上的目录中。将卷装入容器时,此目录就是装入容器的目录。这与绑定装载的工作方式类似,只是卷由Docker管理,并且与主机的核心功能隔离

给定的卷可以同时装入多个容器中。当没有正在运行的容器正在使用卷时,Docker仍然可以使用该卷,并且不会自动删除该卷。您可以使用docker volume prune删除未使用的卷

装载卷时,它可能是命名卷或匿名卷。匿名卷第一次装入容器时没有给出显式名称,因此Docker会给它们一个随机名称,该名称保证在给定Docker主机中是唯一的。除了名称之外,命名卷和匿名卷的行为方式相同

卷还支持使用卷驱动程序,它允许您将数据存储在远程主机或云提供商上,以及其他可能性

绑定装载可以存储在主机系统的任何位置。它们甚至可能是重要的系统文件或目录。Docker主机或Docker容器上的非Docker进程可以随时修改它们。 从Docker早期开始提供。与卷相比,绑定装载的功能有限。使用绑定装载时,主机上的文件或目录将装载到容器中。文件或目录由其在主机上的完整路径引用。Docker主机上不需要已经存在该文件或目录。如果它还不存在,则按需创建。绑定装载的性能非常好,但它们依赖于主机的文件系统,该文件系统具有特定的可用目录结构。如果您正在开发新的DOCKER应用程序,请考虑使用命名卷。不能使用Docker CLI命令直接管理绑定装载

无论好坏,使用绑定装载的一个副作用是,您可以通过容器中运行的进程来更改主机文件系统,包括创建、修改或删除重要的系统文件或目录。这是一种强大的功能,可能会产生安全影响,包括影响主机系统上的非Docker进程

tmpfs mo
docker cp ./src/build/ b081dbbb679b:/usr/share/nginx/html
$ 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