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 服务器正确配置多个用户并访问对应的目录。