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