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'
どうすれば修正できますか?
以下の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フラグを使用します。
回避策として、ホストでmodprobe Fuse
を実行し、--device /dev/Fuse
を使用してコンテナ内のデバイスを取得できます。とにかく、/dev/Fuse
を使用してマウントするには、コンテナを特権モードで起動する必要があります。
Dockerイメージを実行するコマンドは次のとおりです。
docker run -d --rm --device /dev/Fuse --privileged <image_id/name>