无法将基于熔丝的卷暴露给Docker容器

Ore*_*ren 17 linux fuse docker

我正在尝试为我的docker容器提供一定量的加密文件系统供内部使用.这个想法是容器将像往常一样写入卷,但实际上主机将在将数据写入文件系统之前加密数据.

我正在尝试使用EncFS - 它在主机上运行良好,例如:

encfs/encrypted/visible

我可以将文件写入/ visible,然后加密.但是,当尝试使用/ visible作为卷运行容器时,例如:

docker run -i -t --privileged -v/visible:/ myvolume imagename bash

我确实在容器中获得了一个卷,但是它位于原始/加密文件夹中,而不是通过EncFS.如果我从/ visible卸载EncFS,我可以看到容器写的文件.不用说/加密是空的.

有没有办法让docker通过EncFS挂载卷,而不是直接写入文件夹?相比之下,当我使用NFS挂载作为卷时,docker工作正常.它写入网络设备,而不是写入我安装设备的本地文件夹.

谢谢

lar*_*sks 15

我无法在本地复制您的问题.如果我尝试将encfs文件系统公开为Docker卷,则在尝试启动容器时出错:

FATA[0003] Error response from daemon: Cannot start container <cid>:
setup mount namespace stat /visible: permission denied 
Run Code Online (Sandbox Code Playgroud)

所以你可能会有不同的事情发生.无论如何,这就解决了我的问题:

默认情况下,FUSE仅允许挂载文件系统的用户访问该文件系统.当您运行Docker容器时,该容器最初运行为root.

您可以在装入FUSE文件系统时使用allow_rootallow_other装入选项.例如:

$ encfs -o allow_root /encrypted /other
Run Code Online (Sandbox Code Playgroud)

这里,allow_root将允许root用户访问mountpoint,同时allow_other允许任何人访问mountpoint(前提是该目录的Unix权限允许他们访问).

如果我使用encfs filesytem挂载allow_root,我可以将该文件系统公开为Docker卷,并且可以从容器内部正确显示该文件系统的内容.

  • 感谢您的回答,以及评估问题所需的时间.花了很长时间后,我发现底层问题相当平凡:似乎每次我向系统添加一个新的挂载时,我都需要重新启动Docker服务.听起来不太合乎逻辑,但这解决了它.除非我这样做,否则Docker将始终使用mount或文件夹启动时的内容 - 如果没有mount,那么它确实会写入底层的本地文件夹. (5认同)
  • 有可能你正在点击http://blog.oddbit.com/2015/01/18/docker-vs-privatetmp/ (2认同)