web-dev-qa-db-ja.com

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", "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'

どうすれば修正できますか?

17
Cydonia7

以下のNickolayの回答に関して、Fuseでは--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フラグを使用します。

14
Gery Vessere

回避策として、ホストでmodprobe Fuseを実行し、--device /dev/Fuseを使用してコンテナ内のデバイスを取得できます。とにかく、/dev/Fuseを使用してマウントするには、コンテナを特権モードで起動する必要があります。

Dockerイメージを実行するコマンドは次のとおりです。

docker run -d --rm --device /dev/Fuse --privileged <image_id/name>
4
Nickolay