首页 > 编程语言 >python sftp文件上传和Dockerfile部署步骤

python sftp文件上传和Dockerfile部署步骤

时间:2024-05-15 16:41:38浏览次数:13  
标签:log python Dockerfile gz sftp os path local

## 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'

 

标签:log,python,Dockerfile,gz,sftp,os,path,local
From: https://www.cnblogs.com/todarcy/p/18194191

相关文章

  • 【python】*args, **kwargs
    【日期】2024/5/15【作用】以允许函数接收任意数量和类型的非关键字参数(*args)和关键字参数(**kwargs)。*args:允许你将一个不定数量的非关键字参数传递给一个函数。这些参数在函数内部被当作一个元组(tuple)处理。**kwargs:允许你将一个不定数量的关键字参数传递给一个函数。这些参......
  • Python基础篇(流程控制)
    流程控制是程序运行的基础,流程控制决定了程序按照什么样的方式执行。条件语句条件语句一般用来判断给定的条件是否成立,根据结果来执行不同的代码,也就是说,有了条件语句,才可以根据不同的情况做不同的事,从而控制程序的流程。ifelseif条件成立,执行if内的命令;否则条件不成立,则......
  • python列出centos7内存使用前50的进程信息
    python代码,列出centos7系统内存使用排名前50的进程信息,按照内存使用大小从大到小排序。 importpsutil#获取系统内存信息total_memory=psutil.virtual_memory().total/(1024.0**3)#转换为GBavailable_memory=psutil.virtual_memory().available/......
  • error: externally-managed-environment (Python)
     Mac系统Brew安装的最新的python 第一次接触Pythonerror:externally-managed-environment在若依网站下载的项目,试着学习https://gitee.com/liqianglog/django-vue-admin/tree/v1.1.2根据readMe安装初始化时出现了问题Thisenvironment is externallymanaged╰─>......
  • Python可视化训练
    (一)、设计实现电子算盘,并完成测试【题目描述】给小朋友设计一个电子算盘。要求绘制电子算盘界面,设计并实现打珠算过程(界面参考如下图示)。界面右侧要求以图形绘制的方式绘制自画像,注意不能是图像文件显示的形式。  【源代码程序】fromtkinterimport* classBead: ......
  • Python可视化训练
    (一)、设计实现电子算盘,并完成测试【题目描述】给小朋友设计一个电子算盘。要求绘制电子算盘界面,设计并实现打珠算过程(界面参考如下图示)。界面右侧要求以图形绘制的方式绘制自画像,注意不能是图像文件显示的形式。 【源代码程序】fromtkinterimport*definitWindow(): ......
  • python算法:谁是小偷?
    一,for循环:1,功能:重复执行同一段代码语法:forindexinrange(n):   #循环体代码index:用来依次接收可迭代对象中的元素的变量名range()函数:负责返回整数序列流程图:2,应用range可以同时指定start和stop,用for遍历并打印1234#指定start和s......
  • python算法:年龄问题
    一,认识递归函数1,什么是递归?递归的工作原理是,如果函数需要处理的问题大小合适,则直接求解并返回结果,否则将问题分解成两个或多个更小的子问题,并对子问题进行相同的处理,直到问题无法分解为止2,什么是递归函数:递归函数(recursivefunction)是指在函数体中可以调用自己的函数3,语......
  • python算法:青蛙跳台阶
    一,认识递归函数1,什么是递归?递归的工作原理是,如果函数需要处理的问题大小合适,则直接求解并返回结果,否则将问题分解成两个或多个更小的子问题,并对子问题进行相同的处理,直到问题无法分解为止2,什么是递归函数:递归函数(recursivefunction)是指在函数体中可以调用自己的函数3,语......
  • python算法:马克思的数学题
    一,for循环:1,功能:重复执行同一段代码语法:forindexinrange(n):   #循环体代码index:用来依次接收可迭代对象中的元素的变量名range()函数:负责返回整数序列流程图:2,应用range可以同时指定start和stop,用for遍历并打印1234#指定start和s......