docker部署sftp

 

一. 按照我博客中搭建 sftp 的方法做一个 docker 镜像

这种方法可用,但不是最好的,待改进。可参照另一篇博客:设置多用户不同权限的 sftp 服务器搭建

 

1. dockerfile 文件如下,当前目录假定为 sftp_docker

 

FROM ubuntu:14.04
ADD ./source.list /etc/apt/sources.list   #这个是阿里云的源文件,放置在当前目录下

#设置 ssh, 使容器可 SSH 连接,经测试下面的 2 步都是必须的,否则会出错,虽然不太清楚为什么...
RUN apt-get update
RUN apt
-get -y install openssh-server
RUN
mkdir /var/run/sshd
RUN
/bin/sed -i 's/.*session.*required.pam_loginuid.so./session optional pam_loginuid.so/g' /etc/pam.d/sshd

#下面的命令就是参照上面的文字说明一步步写了
RUN groupadd sftp
RUN useradd -g sftp -s /bin/false mysftp
RUN
echo "mysftp:123" | chpasswd \n
RUN
mkdir -p /data/sftp/mysftp
RUN usermod
-d /data/sftp/mysftp mysftp

ADD ./sshd_config /etc/ssh/sshd_config #配置文件见下段代码

RUN chown root:sftp /data/sftp/mysftp
RUN
chmod 755 /data/sftp/mysftp

RUN mkdir /data/sftp/mysftp/upload
RUN
chown mysftp:sftp /data/sftp/mysftp/upload
RUN
chmod 755 /data/sftp/mysftp/upload

EXPOSE 22

#这个 CMD 命令挺重要的,耗了点时间测试,没事再看看

CMD /usr/sbin/sshd -D

 

 

2. 生成镜像文件,镜像名设置为 sftp_test1

docker build -t sftp_test1

 

 

3. 其中上面代码中 sshd_config 配置文件如下

Port 22
Protocol 2
HostKey /etc/ssh/ssh_host_rsa_key
HostKey /etc/ssh/ssh_host_dsa_key
HostKey /etc/ssh/ssh_host_ecdsa_key
HostKey /etc/ssh/ssh_host_ed25519_key
UsePrivilegeSeparation yes
KeyRegenerationInterval 3600
ServerKeyBits 1024
SyslogFacility AUTH
LogLevel INFO
LoginGraceTime 120
PermitRootLogin without-password
StrictModes yes
RSAAuthentication yes
PubkeyAuthentication yes
IgnoreRhosts yes
RhostsRSAAuthentication no
HostbasedAuthentication no
PermitEmptyPasswords no
ChallengeResponseAuthentication no
X11Forwarding yes
X11DisplayOffset 10
PrintMotd no
PrintLastLog yes
TCPKeepAlive yes
AcceptEnv LANG LC_*
UsePAM yes
Subsystem sftp internal-sftp
Match Group sftp
ChrootDirectory /data/sftp/mysftp
ForceCommand internal-sftp
AllowTcpForwarding no

 

阿里云的 ubuntu14 的源文件如下

deb http://mirrors.aliyun.com/ubuntu/ trusty main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ trusty-security main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ trusty-updates main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ trusty-proposed main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ trusty-backports main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ trusty main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ trusty-security main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ trusty-updates main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ trusty-proposed main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ trusty-backports main restricted universe multiverse

 

4. docker-compose 文件如下

 

sftp:
    image: sftp_test1
    volumes:
        - /data/sftp/mysftp/upload/:/data/sftp/mysftp/upload/
    ports:
        - "4004:22"

 

这里需要把本机的 /data/sftp/mysftp/upload 的权限改为 777,这样才能进行在 sftp 容器中进行文件上传

 

 

5. 在 docker-compose 文件夹中执行 docker-compose up -d 启动 sftp 容器,然后 sftp -P 4004 mysftp@127.0.0.1   密码为 123 连上,进入 upload 文件夹中即可进行文件上传了

 

 

 

二.  网上有一个别人做的 sftp 镜像,但是按照他的方法上传有点问题

链接为http://www.mamicode.com/info-detail-2084477.html

写成自己的 docker-compose 文件为

sftp:
  image: atmoz/sftp #冒号后面要后空格

  volumes:
    - /home/foo/test/:/home/foo/ #冒号前面不能有空格

   # - /home/foo1/test1/:/home/foo1 

  ports:
    - "2222:22"
  command: foo:pass:1002 (foo1:pass:1003 #可以有多个用户) 

 

 

解决方法如下

/home/foo/test 文件夹授权 755,在 test 目录下再新建一个文件夹,比如 upload, 把需要上传的文件放置在 upload 中,并且修改 upload 权限为 777

镜像作者的设定应该是把映射目录作为根目录(监狱),根目录是不能有写权限的,需要在下面再建一个子目录

 

 

三. 最新验证的方式

version: '3.1'

services:
sftp:
image: atmoz/sftp
ports:
- "2222:22"
volumes:
#如果挂载 instance
-40001 父目录,那么所有的子目录都有权限访问,分别单独挂载 input 和 output 目录,则只有这两个目录可以访问
#
- /data/aigc/comfyui/instance-40001:/home/sftpuser
- /data/aigc/comfyui/instance-40001/input:/home/sftpuser/input
- /data/aigc/comfyui/instance-40001/output:/home/sftpuser/output
environment:
- SFTP_USERS=sftpuser:123
- PUID=1000 # ec2-user 的 UID
- PGID=1000 # ec2-user 的 GID

说明:

1)PUID 和 PGID 对应 aws 默认用户 ec2-user 的 UID 和 GID, 这样设置是为了不修改宿主机的属主和属组权限

2)SFTP_USERS 的默认用户是 sftpuser, 这个用户名最好不要改,它的属主和属组也是 1000,对应宿主机的 ec2-user

3)修改文件上传目录 Input 权限为 777

 

如果有多个用户,尝试修改如下,还没测试

version: '3.8'

services:
sftp:
image: atmoz/sftp
container_name: sftp
-server
ports:
- "2222:22"
volumes:
- /home/foo/test/:/home/foo/
- /home/foo1/test1/:/home/foo1
command: foo:pass:
1002:1002,foo1:pass:1003:1003
environment:
- PUID=1000
- PGID=1000
restart: unless
-stopped

#command:使用逗号分隔多个用户配置。每个用户的格式为 #username:password:uid:gid。
#volumes:确保每个用户的主目录路径正确配置。
#环境变量:设置 PUID 和 PGID 与 ec2-user 的 UID 和 GID 匹配。

通过以上配置和步骤,可以确保 SFTP 服务器正确配置多个用户并访问对应的目录。