FUSE внутри Docker
Я пытаюсь установить и использовать FUSE внутри контейнера Docker. Мой 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", "run", "/mnt"]
Когда я запускаю программу FUSE, я получаю: /bin/fusermount: fuse device not found, try 'modprobe fuse' first
.
Если я устанавливаю kmod
и запускаю modprobe fuse
во время этапа сборки, я получаю ошибку:
modprobe: ERROR: ../libkmod/libkmod.c:557 kmod_search_moddep() could not open moddep file '/lib/modules/4.4.104-boot2docker/modules.dep.bin'
Как я могу это исправить?
Ответы
Ответ 1
Чтобы добавить к ответу Николая выше, флаг --privileged не является строго обязательным, для предохранителя. И вам лучше не давать столько привилегий вашему контейнеру.
Вы должны быть в состоянии заставить все работать, заменив его на --cap-add SYS_ADMIN, как показано ниже.
docker run -d --rm --device /dev/fuse --cap-add SYS_ADMIN <image_id/name>
Иногда это может не сработать. В этом случае вы должны попытаться настроить профиль AppArmor или просто отключить его следующим образом:
docker run -d --rm --device /dev/fuse --cap-add SYS_ADMIN --security-opt apparmor:unconfined <image_id/name>
Наконец, если все не удается, используйте флаг --privileged.
Ответ 2
В качестве обходного пути вы можете сделать modprobe fuse
на своем хосте, а затем с помощью --device /dev/fuse
получить устройство в контейнере. В любом случае контейнер должен запускаться в привилегированном режиме для монтирования объектов с помощью /dev/fuse
.
Команда для запуска изображения докеров:
docker run -d --rm --device /dev/fuse --privileged <image_id/name>