コンテナにSSHFをマウントするには、fstabを読んでください。

コンテナにSSHFをマウントするには、fstabを読んでください。

私はDockerを使ってイメージを作成し、openjdk:8-jdk-alpine sshfs + fusionを使ってリモートフォルダをマウントしようとしています。そのためにコンテナを実行します。docker run -d --rm --device /dev/fuse --privileged my_container

Dockerfileのコードに次の行を追加しました。

RUN echo "sshfs#myuser@${host}:${folder} $mount_folder fuse allow_other,default_permissions,umask=0007,idmap=file,uidfile=/etc/sshfs_umap,gidfile=/etc/sshfs_gmap,nomap=ignore,StrictHostKeyChecking=no,IdentityFile=/root/.ssh/id_rsa   0       0" >> /etc/fstab

この行は、デフォルトでsshfsを使用してリモートフォルダを/ etc / fstabにマウントするコマンドを追加します。コンテナにアクセスするとファイルは表示されませんが、mount_folder手動で実行すると

$mount -a

フォルダが正常にマウントされました。コンテナの起動時にどのように自動的にインストールできますか?

答え1

次のDockerfile実行コマンドを実行する代わりに動作させました。

RUN echo "sshfs#myuser@${host}:${folder} $mount_folder fuse allow_other,default_permissions,umask=0007,idmap=file,uidfile=/etc/sshfs_umap,gidfile=/etc/sshfs_gmap,nomap=ignore,StrictHostKeyChecking=no,IdentityFile=/root/.ssh/id_rsa   0       0" >> /etc/fstab

これを削除し、.shスクリプトを実行し、次の行を含むdockerfileにCMDコマンドを追加しました。

#!/bin/sh
sshfs -o allow_other -o reconnect -o default_permissions -o 'umask=0007' -o 'idmap=file' -o 'uidfile=/etc/sshfs_umap' -o 'gidfile=/etc/sshfs_gmap' -o 'nomap=ignore' -o 'StrictHostKeyChecking=no' -o 'IdentityFile=/root/.ssh/id_rsa' myuser@$SFTP_HOST:$SFTP_ROOT_FOLDER /myfolder

#do tother things here to run your app

リモートファイルシステムは、Dockerコンテナが実行されるたびにマウントされます。 /etc/fstabが実行されていないのは、おそらくコンテナなので、実際には最初から始まっていないからです。したがって、/ etc / fstabは実行されません。

答え2

docker run -it --rm debian cat /etc/fstab
# UNCONFIGURED FSTAB FOR BASE SYSTEM
failed to resize tty, using default size

Dockerコンテナのfstabを変更できるという事実さえ知りませんでしたが、なぜそれをしたいのか混乱しています。通常、dockerはファイルシステムのマウントを処理し、ボリュームドライバ/プラグインもあります。これを行うSSHFSの場合は、これらすべてを処理します。

docker plugin install vieux/sshfs
Plugin "vieux/sshfs" is requesting the following privileges:
 - network: [host]
 - mount: [/var/lib/docker/plugins/]
 - mount: []
 - device: [/dev/fuse]
 - capabilities: [CAP_SYS_ADMIN]
Do you grant the above permissions? [y/N] y
latest: Pulling from vieux/sshfs
Digest: sha256:1d3c3e42c12138da5ef7873b97f7f32cf99fb6edde75fa4f0bcf9ed277855811
52d435ada6a4: Complete 
Installed plugin vieux/sshfs

docker volume create -d vieux/sshfs -o sshcmd=root@localhost:/srv/ -o password=changeme mysshvol

docker run -it --rm -v mysshvol:/mnt debian

これをしないのはなぜですか?私の経験によれば、実際にDocker用のボリュームドライバ/プラグインを開発していない限り、ボリュームマウント/マッピングをDockerに任せるのが最善です。これにより、追加の手間と追加の依存関係が発生したり、コンテナが特定のボリュームをマウントしたりする必要がなくなります。 。ファイルシステムをコンテナとして。

関連情報