易于使用的SFTP服务器
收藏数: 522
下载次数: 1021723406
类型:

atmoz/sftpSFTP 镜像是一个基于 OpenSSH 的轻量级、易用的 SSH 文件传输协议(SFTP)服务器。它提供安全的文件传输能力,支持多种用户配置方式和灵活的卷挂载,适用于个人、团队或服务器间的安全文件共享场景。
SFTP_USERS 环境变量或配置文件(/etc/sftp/users.conf)定义用户/etc/sftp.d/ 目录下的脚本,支持自定义初始化逻辑debian, latest (Dockerfile)alpine (Dockerfile)支持三种用户定义方式,语法统一为:
user:pass[:e][:uid[:gid[:dir1[,dir2]...]]]
| 字段 | 说明 |
|---|---|
user | 用户名(必填) |
pass | 密码(必填,若使用密钥登录可留空,格式为 user::uid...) |
:e | 可选标记,指示密码为加密格式(如 MD5 加密) |
uid | 可选用户 ID,用于匹配主机文件系统权限 |
gid | 可选用户组 ID,用于匹配主机文件系统权限 |
dir1... | 可选子目录列表,将在用户主目录下自动创建并赋予写权限(若不存在) |
docker run 或 docker-compose 的 command 中指定用户SFTP_USERS 环境变量定义(格式同上)/etc/sftp/users.conf(每行一个用户,格式同上)/home/<user>),无法访问主目录外的文件/home/foo/upload),避免直接挂载 /home(用户无法在主目录根目录创建文件)/etc/ssh/ssh_host_*)| 变量名 | 说明 |
|---|---|
SFTP_USERS | 定义用户,格式同命令参数(如 SFTP_USERS="foo:pass:1001 bar:abc:1002") |
bashdocker run -p 22:22 -d atmoz/sftp foo:pass:::upload
说明:
foo,密码 pass,自动在其主目录下创建 upload 子目录sftp foo@<主机IP> 登录并上传文件到 upload 目录挂载主机目录到用户主目录,并指定 UID 以匹配主机权限:
bashdocker run \ -v /host/path/upload:/home/foo/upload \ # 挂载主机目录到用户子目录 -p 2222:22 -d atmoz/sftp \ # 映射容器 22 端口到主机 2222 端口 foo:pass:1001 # 用户 foo,密码 pass,UID=1001
yamlsftp: image: atmoz/sftp volumes: - /host/path/upload:/home/foo/upload # 挂载主机目录 ports: - "2222:22" # 端口映射 command: foo:pass:1001 # 用户定义(格式:user:pass:uid)
通过 OpenSSH 客户端连接:
bashsftp -P 2222 foo@<主机IP> # -P 指定主机端口(2222),foo 为用户名
将用户信息存储在配置文件中,便于管理多用户:
创建主机配置文件 /host/path/users.conf:
inifoo:123:1001:100 # 用户 foo,密码 123,UID=1001,GID=100 bar:abc:1002:100 # 用户 bar,密码 abc,UID=1002,GID=100 baz:xyz:1003:100 # 用户 baz,密码 xyz,UID=1003,GID=100
启动容器:
bashdocker run \ -v /host/path/users.conf:/etc/sftp/users.conf:ro \ # 只读挂载配置文件 -v sftp_data:/home \ # 挂载数据卷存储用户主目录 -p 2222:22 -d atmoz/sftp
通过 :e 标记加密密码(需提前生成加密字符串):
bashdocker run \ -v /host/path/share:/home/foo/share \ -p 2222:22 -d atmoz/sftp \ 'foo:$1$0G2g0GSt$ewU0t6GXG15.0hWoOX8X9.:e:1001' # 加密密码(MD5格式),UID=1001
使用 atmoz/makepasswd 工具生成 MD5 加密密码:
bashecho -n "your-password" | docker run -i --rm atmoz/makepasswd --crypt-md5 --clearfrom=-
通过挂载公钥文件实现密钥认证(无需密码):
bashdocker run \ -v /host/path/id_rsa.pub:/home/foo/.ssh/keys/id_rsa.pub:ro \ # 挂载公钥到用户密钥目录 -v /host/path/share:/home/foo/share \ -p 2222:22 -d atmoz/sftp \ foo::1001 # 密码留空(仅允许密钥登录),UID=1001
说明:
.ssh/keys/ 目录(容器会自动将所有公钥追加到 .ssh/authorized_keys).ssh/authorized_keys 文件(OpenSSH 要求该文件权限为 600,直接挂载可能权限错误)默认容器会自动生成 SSH 主机密钥,若需避免重建容器时用户收到 MITM 警告,可挂载自定义主机密钥:
生成主机密钥(主机执行):
bashssh-keygen -t ed25519 -f ssh_host_ed25519_key < /dev/null # Ed25519 密钥 ssh-keygen -t rsa -b 4096 -f ssh_host_rsa_key < /dev/null # RSA 密钥(4096位)
启动容器时挂载密钥:
bashdocker run \ -v /host/path/ssh_host_ed25519_key:/etc/ssh/ssh_host_ed25519_key \ -v /host/path/ssh_host_rsa_key:/etc/ssh/ssh_host_rsa_key \ -v /host/path/share:/home/foo/share \ -p 2222:22 -d atmoz/sftp \ foo::1001
容器启动时自动运行 /etc/sftp.d/ 目录下的脚本,用于自定义初始化(如绑定挂载目录):
创建脚本 /host/path/bindmount.sh:
bash#!/bin/bash # 绑定挂载示例:将主机目录挂载到用户子目录 function bindmount() { if [ -d "$1" ]; then mkdir -p "$2" fi mount --bind $3 "$1" "$2" # $3 为可选参数(如 --read-only) } # 绑定挂载(需容器开启 CAP_SYS_ADMIN 权限) bindmount /data/common /home/dave/common bindmount /data/docs /home/peter/docs --read-only # 只读挂载
启动容器(需添加 --cap-add=SYS_ADMIN 权限):
bashdocker run \ --cap-add=SYS_ADMIN \ # 允许使用 mount 命令 -v /host/path/bindmount.sh:/etc/sftp.d/bindmount.sh \ -v /host/data:/data \ # 挂载主机数据目录 -p 2222:22 -d atmoz/sftp \ dave::1001 peter::1002
| 特性 | Debian 版本 | Alpine 版本 |
|---|---|---|
| 体积 | 较大(约 200MB+) | 极小(约 20MB+,比 Debian 小 10 倍) |
| 稳定性 | 高(仅修复 bug 和安全问题,发布周期约 2 年) | 较快(发布周期约 6 个月,版本更新频繁) |
| OpenSSH 版本 | 较旧但稳定 | 较新(随 Alpine 发行版更新) |
选择建议:追求稳定性选 Debian,追求轻量和新版本选 Alpine。
OpenSSH 版本取决于基础镜像的发行版:
注意:镜像构建延迟可能导致 OpenSSH 版本略滞后于基础镜像官方包(通常 1-5 天),如需精确版本可手动克隆源码构建。
您可以使用以下命令拉取该镜像。请将 <标签> 替换为具体的标签版本。如需查看所有可用标签版本,请访问 版本下载页面。



manifest unknown 错误
TLS 证书验证失败
DNS 解析超时
410 错误:版本过低
402 错误:流量耗尽
身份认证失败错误
429 限流错误
凭证保存错误
来自真实用户的反馈,见证轩辕镜像的优质服务