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'

 

posted @ 2024-05-15 16:37  ToDarcy  阅读(68)  评论(0编辑  收藏  举报