Docker 内接保险丝
我试图在Docker容器中安装并使用FUSE。我的Dockerfile如下所示:Docker 内接保险丝,docker,fuse,Docker,Fuse,我试图在Docker容器中安装并使用FUSE。我的Dockerfile如下所示: FROM golang:1.8 WORKDIR /go/src/app COPY . . RUN apt-get update && apt-get install -y fuse && rm -rf /var/lib/apt/lists/* RUN go-wrapper download RUN go-wrapper install CMD ["go-wrapper", "r
FROM golang:1.8
WORKDIR /go/src/app
COPY . .
RUN apt-get update && apt-get install -y fuse && rm -rf /var/lib/apt/lists/*
RUN go-wrapper download
RUN go-wrapper install
CMD ["go-wrapper", "run", "/mnt"]
当我运行程序安装保险丝时,我得到:/bin/fusermount:FUSE device not found,请先尝试“modprobe FUSE”
如果在构建步骤中安装kmod
并运行modprobe fuse
,则会出现错误:
modprobe:ERROR:../libkmod/libkmod.c:557 kmod\u search\u moddep()无法打开moddep文件'/lib/modules/4.4.104-boot2docker/modules.dep.bin'
如何修复此问题?作为一种解决方法,您可以在主机上执行
modprobe fuse
,然后使用--device/dev/fuse
将设备放入容器中。无论如何,容器应该在特权模式下启动,以便使用/dev/fuse
装载东西
运行docker映像的命令是:
docker run -d --rm --device /dev/fuse --privileged <image_id/name>
docker运行-d--rm--device/dev/fuse--privileged
关于Nickolay下面的回答,保险丝不严格要求使用--privileged
标志。你最好避免给你的容器太多特权
您应该能够将其替换为——cap add SYS\u ADMIN
,如下所示
docker run -d --rm \
--device /dev/fuse \
--cap-add SYS_ADMIN \
<image_id/name>
docker运行-d--rm\
--设备/开发/保险丝\
--cap添加系统管理员\
有时这可能不起作用。在这种情况下,您应该尝试调整AppArmor配置文件,或者按如下方式禁用它:
docker run -d --rm \
--device /dev/fuse \
--cap-add SYS_ADMIN \
--security-opt apparmor:unconfined \
<image_id/name>
docker运行-d--rm\
--设备/开发/保险丝\
--cap添加系统管理员\
--安全装置:无限制\
最后,如果所有操作都失败,请使用--privileged标志。您需要以privileged身份运行容器,或者,专门添加
SYS\u ADMIN
。如何运行容器?您是否指定--privileged模式?我使用docker run-it--rm
。添加--privileged
无助于modprobe
错误消息,也无助于FUSE消息。感谢您提供的解决方法。理想情况下,我希望它也能在OSX上工作,我不知道是否有任何方法可以在它上面模拟/dev/fuse
。这可能是解决方案,因为docker监狱不运行自己的内核,所以您需要在监狱外加载模块,并且主机允许设备访问。小心并检查fuse设备是否可用于越狱。我知道我来晚了,但在OS X上,fuse for OS X工作得很好,可以通过brew
安装:brew安装osxfuse
,或者如Gary所述,应该非常小心地使用--privileged选项。更多细节(关于风险)在这篇中间帖子中:SYS_ADMIN cap是否基本上等同于在特权模式下运行容器?@Ibrahim SYS_ADMIN是其中之一——特权添加了,但特权也删除了Docker默认提供的更多保护(默认cgroup、seccomp配置文件等)因此,最终的结果是指定--cap add SYS_ADMIN要比--privilegedI think--device/dev/fuse
安全得多,docker run cmd中不应包含这一点。这使容器能够访问主机的/dev/fuse,这不是请求的IIUC。@GenericRatzlaugh它是相同的内核,因此是相同的/dev/fuse
。(设备文件基本上只是内核接口的别名。)您需要它与FUSE接口,但您可以使用用户名称空间从内核版本4.18开始添加隔离。有关详细信息,请参阅。@nickgryg关于使用--device/dev/fuse的响应更好