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>