python sftp文件上传和Dockerfile部署步骤
## 1、脚本 app.py
# -*- coding:utf8 -*- import os import paramiko from datetime import datetime, timedelta from flask import Flask, request app = Flask(__name__) # 从环境变量中获取配置信息 host = os.getenv("SFTP_HOST") port = int(os.getenv("SFTP_PORT")) username = os.getenv("SFTP_USERNAME") password = os.getenv("SFTP_PASSWORD") local_path = os.getenv("LOCAL_PATH") remote_path = os.getenv("REMOTE_PATH") log_dir = os.path.join(os.getcwd(), "output") os.makedirs(log_dir, exist_ok=True) log_file = os.path.join(log_dir, f"log_{datetime.now().strftime('%Y-%m-%d_%H-%M-%S')}.log") def sftp_push(host, port, username, password, local_path, remote_path): # 创建 SSH 客户端 client = paramiko.SSHClient() client.set_missing_host_key_policy(paramiko.AutoAddPolicy()) try: # 连接 SFTP 服务器 client.connect(host, port, username, password) # 创建 SFTP 客户端 sftp = client.open_sftp() # 推送文件 # 具体文件 按时间生成 # 获取当前日期和时间 current_date = datetime.now() # 计算前一天的日期 previous_date = current_date - timedelta(days=1) # 格式化日期为指定格式(例如:20240101) formatted_date = previous_date.strftime("%Y%m%d") gz = "gz" + formatted_date + ".CSV" hk = "gz" + formatted_date + ".CSV" log(f"文件:{local_path + gz}") log(f"文件:{local_path + hk}") if os.path.isfile(local_path + gz): sftp.put(local_path + gz, remote_path + gz) log(f"成功推送文件:{local_path + gz} 到 {remote_path + gz}") else: log(f"文件不存在:{local_path + gz}") if os.path.isfile(local_path + hk): sftp.put(local_path + hk, remote_path + hk) log(f"成功推送文件:{local_path + hk} 到 {remote_path + hk}") else: log(f"文件不存在:{local_path + hk}") except Exception as e: log(f"推送文件失败:{local_path + gz} 到 {remote_path} 错误信息:{e}") log(f"推送文件失败:{local_path + hk} 到 {remote_path} 错误信息:{e}") finally: # 关闭连接 sftp.close() client.close() def log(message): with open(log_file, "a") as f: timestamp = datetime.now().strftime("%Y-%m-%d %H:%M:%S") log_message = f"[{timestamp}] {message}\n" f.write(log_message) @app.route("/trigger", methods=["POST"]) def trigger_task(): sftp_push(host, port, username, password, local_path, remote_path) return "任务已触发, 时间:" + datetime.now().strftime("%Y-%m-%d %H:%M:%S") if __name__ == "__main__": app.run(host='0.0.0.0', port=5000)
## 2、Dockerfile
# 使用 Python 官方镜像作为基础镜像 FROM python:3.9-alpine # 设置工作目录 WORKDIR /app # 将当前目录下的文件复制到镜像中的 /app 目录 COPY . /app # 安装依赖 RUN pip install --no-cache-dir -r requirements.txt # 将宿主机的目录挂载到容器中的 /app 目录 VOLUME /tmp/csv/ EXPOSE 5000 # 运行程序 CMD [ "python", "app.py" ]
## 3、requirements.txt
paramiko
schedule
flask
## 4、 部署镜像
docker build -t sftp-push .
## 5、启动容器
docker run -d --name sftp-push -p 50001:5000 --rm -e SFTP_HOST=10.10.1.1 -e SFTP_PORT=22 -e SFTP_USERNAME=username -e SFTP_PASSWORD=pwd -e LOCAL_PATH=/tmp/csv/ -e REMOTE_PATH=/ioa-supplier/ -v 拿自己本地宿主机的目录即可:/tmp/csv/ sftp-push
## 6、执行端口 50001
curl -X POST 'http://127.0.0.1:50001/trigger'