我尝试iso9660
在 ubuntu docker 容器中挂载一个,但是得到了一个Unknown error -1
。
docker run -i -t --rm ubuntu:16.04
apt-get update
apt-get install wget
wget http://dl-cdn.alpinelinux.org/alpine/v3.8/releases/x86_64/alpine-virt-3.8.0-x86_64.iso
mkdir /mnt/alpine
mount -t iso9660 -o loop,offset=0 /alpine-virt-3.8.0-x86_64.iso /mnt/alpine/
输出:
mount: /mnt/alpine/: mount failed: Unknown error -1
这里alpine-virt-3.8.0-x86_64.iso
仅用于测试目的。
答案1
我猜测这是一个权限问题,容器没有足够的权限来执行 mount() 操作。
请检查以下内容:
http://man7.org/linux/man-pages/man7/capabilities.7.html
和
https://docs.docker.com/engine/reference/run/#runtime-privilege-and-linux-capabilities
您很可能需要:
CAP_SYS_ADMIN
让它工作起来,这非常强大。
根据您使用的操作系统/发行版,SELinux 也可能处于活动状态,并且阻止权限。
取决于您的用例,但一般来说,在生产系统上,我建议采用另一种解决方案。将容器权限提升到 SYS_ADMIN 级别绝对不是一个安全的想法。例如,在容器外进行挂载,并映射挂载的文件夹。
答案2
默认情况下,您无法在容器内运行 mount ,这可能会允许用户逃离容器隔离(例如挂载主机根文件系统)。如果您信任您的应用程序,您可以将容器配置为使用额外功能运行,以允许 mount 命令hargut 建议。
但是,我更倾向于将数据作为卷挂载到容器中。你可以在 docker 之外下载文件,然后将其挂载:
wget http://dl-cdn.alpinelinux.org/alpine/v3.8/releases/x86_64/alpine-virt-3.8.0-x86_64.iso
docker run -i -t --rm --mount type=volume,dst=/mnt/alpine,volume-driver=local,volume-opt=type=iso9660,\"volume-opt=o=loop,offset=0\",volume-opt=device=$(pwd)/alpine-virt-3.8.0-x86_64.iso ubuntu:16.04
如果您希望能够使用可重复使用的名称挂载此卷,您还可以创建一个命名卷,并将类似的选项传递给该命令。