• 2020系统综合实践5 使用Dokcer部署Python运行环境


    项目结构

    结构

    Python镜像搭建

    pip

    requirements.txt中声明这次实验所需依赖:

    PyMySQL
    opencv-python
    

    为了提高依赖下载速度,修改pip.conf,换为清华源:

    [global]
    index-url = https://pypi.tuna.tsinghua.edu.cn/simple
    [install]
    trusted-host = https://pypi.tuna.tsinghua.edu.cn
    

    Dockerfile

    FROM python
    
    WORKDIR /usr/src/app # 设置工作目录
    
    COPY ./pip.conf ~/.pip/pip.conf # 换源
    COPY requirements.txt ./ # 添加依赖声明文件
    RUN pip install --no-cache-dir -r requirements.txt # 安装依赖
    
    ENTRYPOINT [ "python" ] # 实现命令行式调用容器
    CMD [ "hello.py" ] # ENTRYPOINT默认参数
    

    构建镜像

    docker build -t my-py .
    

    build

    部署运行

    hello world

    # hello.py
    print('hello world')
    
    docker run --rm -v /home/qyanzh/h5/python/code:/usr/src/app my-py
    

    hello

    参数说明

    • 使用-v将本地目录挂载到python工作目录以方便代码修改
    • --rm运行完毕后自动移除容器
    • 默认使用Dockerfile中指定的hello.py作为参数

    日历

    # date.py
    import calendar
    yy = int(input("输入年份: "))
    mm = int(input("输入月份: "))
    print(calendar.month(yy,mm))
    
    docker run -it --rm -v /home/qyanzh/h5/python/code:/usr/src/app my-py date.py
    

    date2

    参数说明

    • 指定传给ENTRYPOINT的参数date.py
    • -it声明需要交互式终端以读取输入(i for interactive, t for terminal),否则会出现下图错误date1

    PyMySQL数据库操作

    首先需要运行数据库服务器

    db

    # db.py
    import pymysql
    
    # 打开数据库连接
    db = pymysql.connect("cdb", "qyanzh", "1234", "db_example")
    
    # 使用 cursor() 方法创建一个游标对象 cursor
    cursor = db.cursor()
    
    # 使用 execute()  方法执行 SQL 查询
    cursor.execute("SELECT VERSION()")
    
    # 使用 fetchone() 方法获取单条数据.
    data = cursor.fetchone()
    
    print("Database version : %s " % data)
    
    # 使用预处理语句创建表
    sql = """CREATE TABLE IF NOT EXISTS EMPLOYEE (
             FIRST_NAME  CHAR(20) NOT NULL,
             LAST_NAME  CHAR(20),
             AGE INT,
             SEX CHAR(1),
             INCOME FLOAT )"""
    
    cursor.execute(sql)
    
    # SQL 插入语句
    sql = """INSERT INTO EMPLOYEE(FIRST_NAME,
             LAST_NAME, AGE, SEX, INCOME)
             VALUES ('Mac', 'Mohan', 20, 'M', 2000)"""
    try:
       # 执行sql语句
       cursor.execute(sql)
       # 提交到数据库执行
       db.commit()
    except:
       # 如果发生错误则回滚
       db.rollback()
    
    # SQL 查询语句
    sql = """SELECT * FROM EMPLOYEE"""
    
    try:
       # 执行SQL语句
       cursor.execute(sql)
       # 获取所有记录列表
       results = cursor.fetchall()
       for row in results:
          fname = row[0]
          lname = row[1]
          age = row[2]
          sex = row[3]
          income = row[4]
           # 打印结果
          print ("fname=%s,lname=%s,age=%s,sex=%s,income=%s" % 
                 (fname, lname, age, sex, income ))
    except:
       print ("Error: unable to fetch data")
    
    # 关闭数据库连接
    db.close()
    
    docker run -it --rm -v /home/qyanzh/h5/python/code:/usr/src/app --link=cdb:cdb my-py db.py
    

    sql2

    参数说明

    • --link=容器名:容器别名命令可以实现容器间的互访(也可以用其他方式实现),否则由于容器间的隔离性,py容器会找不到数据库容器sql1

    OpenCV

    以下代码实现了将图片旋转90度并保存的操作:

    # cv.py
    import cv2
    
    # flags传入0表示灰度图像, 1表示彩色图像
    img=cv2.imread('test.jpg',flags=1)
    
    # 获取图片尺寸
    rows,cols=img.shape[:2]
    
    # 这里的第一个参数为旋转中心,第二个为旋转角度,第三个为旋转后的缩放因子
    # 可以通过设置旋转中心,缩放因子,以及窗口大小来防止旋转后超出边界的问题
    M=cv2.getRotationMatrix2D((cols/2,rows/2),90,1)
    
    # 第三个参数是输出图像的尺寸中心
    dst=cv2.warpAffine(img,M,(cols,rows))
    
    # 写入文件
    cv2.imwrite("test-rotated.jpg", dst, [int(cv2.IMWRITE_JPEG_QUALITY), 100])
    print('rotated and saved.')
    
    docker run --rm -v /home/qyanzh/h5/python/code:/usr/src/app my-py cv.py
    

    可以看到目录下多出了OpenCV生成的test-rotated.jpg

    cv

    cv效果

    用时与心得

    作业内容约2小时,博客0.5小时。经过前几次的历练,这次作业显得比较容易,看到要安装依赖时已经形成条件反射,先去找怎么给pip换源了(手动狗头)。

    参考

    第5次实践作业 - 作业 - 2017级系统综合实践 - 班级博客 - 博客园

    python - Docker Hub

    Ubuntu环境的docker实践——python - 旺得福000 - 博客园

    python requirements文件生成与使用 - 简书

    将pip源更换到国内镜像_python_LittleBee的博客-CSDN博客

    Python 生成日历 | 菜鸟教程

    6 Dockerfile指令详解 && ENTRYPOINT 指令 - tengq - 博客园

    Python3 MySQL 数据库连接 – PyMySQL 驱动 | 菜鸟教程

    Docker容器互访三种方式 - 三只松鼠 - 博客园

    OpenCV-Python 中文教程(搬运)目录 - _Undo - 博客园

    (一)OpenCV-Python学习—基础知识 - silence_cho - 博客园

    opencv 图片旋转 - MARK+ - 博客园

  • 相关阅读:
    系统可靠性测试
    系统可靠性的技术设计
    可靠性测试的基础知识——软件可靠性测试
    可靠性测试的基础知识——可靠性的计算方法
    python 中英文时间转换
    Python之日期与时间处理模块(date和datetime)
    使用Python操作Redis
    scrapy操作指南
    爬虫中什么是requests
    面向对象的自我总结
  • 原文地址:https://www.cnblogs.com/zaynq/p/12899727.html
Copyright © 2020-2023  润新知