读取 fstab 以在容器中挂载 sshfs

读取 fstab 以在容器中挂载 sshfs

我正在使用 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 中。当我访问容器时,我看不到 my 中的文件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

我将其删除,并在 dockerfile 中添加了 CMD 命令,该命令运行 .sh 脚本并包含以下行:

#!/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 开发卷驱动程序/插件,否则会带来很多额外的麻烦和额外的依赖项,否则您的容器将不需要挂载特定的卷。文件系统到容器。

相关内容