如何在 Docker 容器中挂载 --bind?

Posted

技术标签:

【中文标题】如何在 Docker 容器中挂载 --bind?【英文标题】:How do I mount --bind inside a Docker container? 【发布时间】:2016-08-01 21:44:15 【问题描述】:

我有这个基于debian:jessie 的容器(但这不是很相关,因为我对alpine:3.3 有同样的问题)。我到了我需要的地方

mount --bind /htdocs/www /home/user/example.com/www

我明白了

mount: permission denied

我在任何内核日志中都找不到任何东西,-vvv 没有产生任何有趣的东西。我显然可以在主机上执行此操作(使用任何其他子树/节点对)。在我上面的示例中,/htdocs/www 是 Docker 卷的挂载点,但它看起来并不重要,因为我不能 mount --bind 容器内的任何一对子树/节点。

【问题讨论】:

是否有理由从容器内部挂载?使用-v /home/user/example.com/www:/htdocs/www 运行容器可能是一个更好的解决方案,因为它对这些文件来自的容器是透明的,并且不需要给容器额外的权限 好点。但是,每次我想向现有用户添加新用户和/或另一个站点时,这都会迫使我重新创建容器。我希望能够在正在运行的容器上执行此操作,而不必中断它。 你不应该在一个容器中放置多个站点;旋转一个容器大约需要 300 毫秒。容器中只有一个站点,也使它更清洁;您只有 -that- 站点所需的东西,并且(例如)您不必担心可能会发生冲突(site-a,site-b) 我从未说过要在一个容器中放置多个站点。事实上,每个子域都有自己的 apache/php 容器。我在这里做的是拥有一个 sftp-server 容器。不幸的是,我不能使用 ssh/ftp 进行基于主机名的代理,因此必须这样做:一个容器、多个用户、挂载绑定和/或符号链接(取决于 chroot 状态)。我可以说这个问题与这个***.com/questions/36546147/… 相关,而后者又与另一个相关。 啊,对了,谢谢解释 【参考方案1】:

尝试使用--privileged 标志:

docker run --rm -it --privileged=true debian
mkdir /mnt/test
mount --bind /home /mnt/test/

【讨论】:

【参考方案2】:

要使用mount 系统调用,您需要CAP_SYS_ADMIN 功能。默认情况下,Docker 在生成容器时会放弃所有功能(这意味着即使作为 root,您也不能做任何事情)。请参阅mount(2) man page 了解更多信息。

您可以使用--cap-add=SYS_ADMIN 标志启动您的容器,以将此功能添加到您的容器中:

root@host > docker run --rm -it --cap-add=SYS_ADMIN debian:jessie
root@ee0b1d5fe546:/# mkdir /mnt/test
root@ee0b1d5fe546:/# mount --bind /home /mnt/test/
root@ee0b1d5fe546:/# 

谨慎使用。不要在特权容器中运行不受信任的软件。

【讨论】:

我保证我会非常小心 :) 谢谢。 我得到:/# mount --bind /home /mnt/test/ mount: /home is write-protected, mounting read-only mount: cannot mount /home read-only 这将错误从“权限被拒绝”更改为“失败”。即使添加所有功能仍然失败。按照哈维尔的回答使用 privileged=true 有效。

以上是关于如何在 Docker 容器中挂载 --bind?的主要内容,如果未能解决你的问题,请参考以下文章

docker中容器有必要挂载到主机上吗存储

docker-修改容器挂载目录的3种方法小结

如何将docker容器的根目录挂载为NFS挂载点

如何挂载容器可写主机目录?

docker:如何查看容器的挂载目录

docker如何修改挂载路径(挂载目录)?(没弄完,先去弄别的)