• 2020系统综合实践 第5次实践作业


    本次作业为Python专题。Python是将练习使用docker容器运行Python程序。Python是很常用的程序设计语言,但是Python程序的运行依赖于提前的系统环境配置,为了降低系统配置的复杂度,同时减小资源开销,将系统环境容器化是一种解决方案。请根据Python官方镜像的镜像说明,自定义Python镜像文件,将Python程序运行起来。

    1、Python自定义镜像搭建

    docker pull python:3.7  #拉取dockerhub上的python镜像
    
    • Dockerfile文件
    FROM python:3.7
    WORKDIR /usr/src/app  
    COPY requirements.txt ./  
    RUN pip install --no-cache-dir -i https://pypi.tuna.tsinghua.edu.cn/simple -r requirements.txt
    COPY apps/hello.py /usr/src/app/
    VOLUME /usr/src/app
    ENTRYPOINT ["python"]    
    CMD ["hello.py"]   
    
    • requirements.txt中声明所需依赖:
    PyMySQL
    opencv-python
    
    • 文档结构

    docker build -t python:v1 .  #构建自定义镜像
    

    2、运行Python程序

    通过容器完成简单helloworld、日历输出mysql数据库操作opencv程序的部署运行
    mysql数据库可以使用之前作业创建的镜像
    opencv可以参照链接任意选择

    为便于程序修改调试,在容器启动时需将本地文件目录挂载至容器内的工作目录

    2.1 helloworld

    #hello.py
    print('hello world')
    #无交互式输入:
    docker run -v /home/ubuntu/fifth/apps:/usr/src/app --rm python:fifth
    

    参数说明:

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

    2.2 日历输出

    #date.py
    import calendar
    yy = int(input("输入年份: "))
    mm = int(input("输入月份: "))
    print(calendar.month(yy,mm))
    #有交互式输入:
    docker run -it -v /home/ubuntu/fifith/apps:/usr/src/app --rm python:fifth date.py
    

    注意:

    • 当命令行有输入需要执行的python文件就不会执行dockerfile中的CMD ["hello.py"]命令。
    • 由于用到了input,需要输入内容,因此运行容器的时候需要用到-it参数,否则会报EOFError: EOF when reaeding a line的错误。

    2.3 mysql数据库操作

    db.py文件

    #添加('031702521','yzl')
    import pymysql
    
    # 打开数据库连接
    db = pymysql.connect("cthmysql", "docker", "123456", "docker_mysql")
    
    # 第一个参数是本地容器名字
    # 第二三个参数是数据库的使用用户与密码
    # 第四个参数是数据库名称
    # 创建游标对象
    
    cursor = db.cursor()
    # 先查询一次数据库数据
    sql = """select * FROM test"""
    cursor.execute(sql)
    results = cursor.fetchall()
    print(results)
    
    # SQL插入语句
    sql = """insert test(id,name)
    	values('031702521','yzl')"""
    cursor.execute(sql)
    db.commit()
    
    # 插入完成后再读取一次数据库数据
    sql = """select * FROM test"""
    cursor.execute(sql)
    results = cursor.fetchall()
    print(results)
    
    # 关闭数据库连接
    db.close()
    
    • 运行指令:
    • sudo docker run -it --rm -v /home/cgh/exam5/apps:/usr/src/app --link=cghmysql exam5-py mysql.py

    • 然后我们再去终端看看数据库,成功添加了。

    2.4 opencv程序的部署运行

    opencv.py

    # cv.py将图片旋转90度并保存
    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 -v /home/ubuntu/fifth/apps:/usr/src/app --rm python:fifth opencv.py
    

    3、小结

    3.1 问题和解决办法

    问题一:镜像构建不成功,说是找不到目录
    
    解决方法:百度了下是因为docker的注释问题#影响到了镜像构建时的读入问题,把注释换行或是去掉即可。
    
    问题二:数据库连接不成功
    
    解决方法:容器没开启且名字不匹配,要注意匹配各个对于的名字和格式,就可以连接成功
    

    3.2 经验和时间

    这次实验较上次简单很多,花了大概6小时左右,注意理解好数据库,镜像构建,就可以轻松完成。与之前的实验二汇总联系起来,更通俗易懂,让我理解了许多内容,思路也清晰起来。

  • 相关阅读:
    normalize.css 中文版
    [转载]自适应高度输入框
    【转载】H5页面列表的无线滚动加载(前端分页)
    CSS设置table下tbody滚动条与thead对齐的方法
    [转载]Jquery mobiscroll 移动设备(手机)wap日期时间选择插件以及滑动、滚动插件
    wordpress 目录、数据结构和解析原理
    WordPress基础知识:条件判断标签及用法大全
    主题如何添加tag标签页面
    WordPress进阶:[2]不同页面显示不同的侧边栏
    WordPress进阶:[1]怎样用tag标签做导航菜单
  • 原文地址:https://www.cnblogs.com/xzytxdy/p/12933279.html
Copyright © 2020-2023  润新知