
jmcombs/sftpSFTP Docker镜像是一个基于OpenSSH的轻量级SFTP(SSH文件传输协议)和SCP服务器,支持多用户配置、卷挂载和自定义SSH密钥。该镜像为atmoz/sftp的分支版本,新增了SCP支持和多平台兼容性,适用于安全、便捷的文件传输场景。
| 标签 | 说明 | Dockerfile链接 |
|---|---|---|
debian | 基于Debian系统,默认标签(latest) | Dockerfile |
alpine | 基于Alpine系统,体积更小 | Dockerfile-alpine |
/etc/sftp.d/目录执行自定义启动脚本,实现高级配置(如绑定挂载、权限调整等)。用户可通过以下三种方式定义,语法格式为:
user:pass[:e][:uid[:gid[:dir1[,dir2]...]]]
| 参数 | 说明 |
|---|---|
user | 用户名(必填) |
pass | 密码(明文或加密,若加密需添加:e标记) |
e | 可选,标记密码为加密格式(如使用crypt生成的哈希) |
uid | 可选,用户ID(自定义以匹配主机文件权限) |
gid | 可选,组ID |
dir | 可选,用户主目录下的子目录列表(自动创建,具有写权限) |
示例:foo:pass:1001:100:upload,docs 表示用户foo,密码pass,UID=1001,GID=100,自动创建upload和docs子目录。
直接在启动命令中指定用户,多个用户用空格分隔:
bashdocker run ... jmcombs/sftp "user1:pass1:1001" "user2:pass2:1002:100:data"
通过SFTP_USERS环境变量传入用户配置:
bashdocker run -e SFTP_USERS="user1:pass1:1001 user2:pass2:1002" ... jmcombs/sftp
挂载包含用户配置的文件至/etc/sftp/users.conf(只读权限):
bashdocker run -v /host/users.conf:/etc/sftp/users.conf:ro ... jmcombs/sftp
配置文件格式(每行一个用户):
iniuser1:pass1:1001:100:upload # 用户1:密码明文,UID=1001,GID=100,创建upload目录 user2:$1$xyz$abc:e:1002 # 用户2:密码加密(带:e标记),UID=1002
/home/<user>),需通过子目录实现文件上传(用户无法直接在主目录创建文件)。/etc/ssh/ssh_host_*)。创建用户foo(密码pass),自动生成upload目录,映射容器22端口至主机22端口:
bashdocker run -p 22:22 -d jmcombs/sftp foo:pass:::upload
将主机目录挂载至用户foo的upload子目录,指定UID=1001以匹配主机权限:
bashdocker run \ -v /host/upload:/home/foo/upload \ # 挂载主机目录至用户子目录 -p 2222:22 \ # 主机2222端口映射容器22端口 -d jmcombs/sftp \ foo:pass:1001 # 用户配置:用户名foo,密码pass,UID=1001
yamlversion: "3" services: sftp: image: jmcombs/sftp volumes: - /host/upload:/home/foo/upload # 挂载主机目录 ports: - "2222:22" # 端口映射 command: foo:pass:1001 # 用户配置
登录方式:使用SFTP客户端连接主机2222端口:
bashsftp -P 2222 foo@<主机IP>
挂载用户配置文件,批量定义用户:
users.conf:inifoo:123:1001:100:data # 用户foo,密码123,UID=1001,GID=100,创建data目录 bar:456:1002:100:docs # 用户bar,密码456,UID=1002,GID=100,创建docs目录
bashdocker run \ -v /host/users.conf:/etc/sftp/users.conf:ro \ # 挂载配置文件(只读) -v sftp_data:/home \ # 挂载卷存储用户数据 -p 2222:22 -d jmcombs/sftp
使用加密密码(需添加:e标记),避免明文传输:
crypt模块):bashdocker run --rm python:alpine python -c "import crypt; print(crypt.crypt('YOUR_PASSWORD'))"
输出示例:$1$0G2g0GSt$ewU0t6GXG15.0hWoOX8X9.
bashdocker run \ -v /host/share:/home/foo/share \ -p 2222:22 -d jmcombs/sftp \ 'foo:$1$0G2g0GSt$ewU0t6GXG15.0hWoOX8X9.:e:1001' # :e标记表示密码已加密
挂载公钥文件至用户.ssh/keys/目录,自动添加至authorized_keys:
bashdocker run \ -v /host/id_rsa.pub:/home/foo/.ssh/keys/id_rsa.pub:ro \ # 挂载公钥 -v /host/share:/home/foo/share \ -p 2222:22 -d jmcombs/sftp \ foo::1001 # 密码留空(仅允许密钥登录),UID=1001
挂载自定义主机密钥,避免容器重建导致指纹变化:
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密钥
bashdocker run \ -v /host/ssh_host_ed25519_key:/etc/ssh/ssh_host_ed25519_key \ -v /host/ssh_host_rsa_key:/etc/ssh/ssh_host_rsa_key \ -v /host/share:/home/foo/share \ -p 2222:22 -d jmcombs/sftp \ foo::1001
将脚本挂载至/etc/sftp.d/目录,容器启动时自动执行(如绑定挂载目录):
/host/sftp.d/bindmount.sh:bash#!/bin/bash # 绑定挂载示例:将/data/common共享至多个用户目录 function bindmount() { mkdir -p "$2" mount --bind "$1" "$2" # 绑定挂载源目录至目标目录 } bindmount /data/common /home/dave/common # 用户dave的common目录 bindmount /data/common /home/peter/common # 用户peter的common目录 bindmount /data/docs /home/peter/docs --read-only # 只读挂载docs目录
CAP_SYS_ADMIN权限):bashdocker run \ --cap-add=CAP_SYS_ADMIN \ # 允许mount系统调用 -v /host/sftp.d:/etc/sftp.d:ro \ # 挂载脚本目录 -v /data:/data \ # 挂载源数据目录 -p 2222:22 -d jmcombs/sftp \ dave::1001 peter::1002 # 创建用户dave和peter
| 特性 | Debian版本 | Alpine版本 |
|---|---|---|
| 镜像大小 | 较大(约200MB) | 极小(约20MB,小10倍) |
| OpenSSH版本 | 稳定,仅包含安全修复和bugfix | 版本更新较快(6个月发布周期) |
| 适用场景 | 稳定性优先的生产环境 | 资源受限环境(如边缘设备) |
OpenSSH版本取决于基础镜像的包管理系统:
可通过以下链接查询具体版本:
镜像每日自动构建,确保集成基础镜像和OpenSSH的最新安全更新。



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