zoukankan      html  css  js  c++  java
  • 2020系统综合实践 第5次实践作业

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

    一、Python环境搭建

      0、项目结构

      1、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   #添加清华源安装依赖
    VOLUME /usr/src/app
    ENTRYPOINT ["python"]    # 实现命令行式调用容器
    CMD ["hello.py"]   # ENTRYPOINT默认参数

      2、requirements.txt

    PyMySQL
    opencv-python
    cryptography
    docker build -t  python:v1 .

    二、运行Python

    1、helloworld

    #hello.py
    print('hello world')
    docker run -v /home/zxl/python/apps:/usr/src/app --rm python:v1

    参数说明:

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

     

    2、显示日期

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

    注意:

    • 当命令行有输入需要执行的python文件就不会执行dockerfile中的CMD ["hello.py"]命令。
    • 由于用到了input,需要输入内容,因此运行容器的时候需要用到-it参数,否则会报EOFError: EOF when reaeding a line的错误。
    • 以上两个例子没有用到在requirements.txt中添加额外的包

     

     3、mysql数据库

      3.1 docker network create 创建一个互联网络

     docker network create --subnet=172.1.0.0/16 py_mysql #创建名为py_mysql的网络

       3.2在互联网络中运行python容器和mysql容器

    docker run --network py_mysql --name mysql1 -d mysql:v1  #在网络py_mysql中后台运行mysql容器(mysql1)
    docker exec -it mysql1 /bin/bash  #进入容器
    docker run -it --network py_mysql -v /home/zxl/python/apps:/usr/src/app --rm python:v1 db.py   #运行python容器
    import pymysql
     
    # 打开数据库连接
    db = pymysql.connect("mysql1","zxl","123456","db_example" )
     
    # 使用 cursor() 方法创建一个游标对象 cursor
    cursor = db.cursor()
     
    # 使用 execute() 方法执行 SQL,如果表存在则删除
    cursor.execute("DROP TABLE IF EXISTS user")
     
    # 使用预处理语句创建表
    sql1 = """CREATE TABLE user (
             id  CHAR(20) NOT NULL,
             name  CHAR(20),
             age INT)"""
    cursor.execute(sql1)
     
    # SQL 插入语句
    sql2 = """INSERT INTO user(id,
             name, age)
             VALUES ('031702317', 'leilei', 20)"""
    try:
       # 执行sql2语句
       cursor.execute(sql2)
       # 提交到数据库执行
       db.commit()
    except:
       # 如果发生错误则回滚
       db.rollback()
    
    # SQL 查询语句
    sql3="""SELECT * FROM user"""
    try:
       # 执行SQL语句
       cursor.execute(sql3)
       # 获取所有记录列表
       results = cursor.fetchall()
       for row in results:
          id = row[0]
          name = row[1]
          age = row[2]
           # 打印结果
          print ("id=%s,name=%s,age=%s" % 
                 (id, name, age))
    except:
       print ("Error: unable to fetch data")
    # 关闭数据库连接
    db.close()

     

     

     4、opencv程序部署

    #cv.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/zxl/python/apps:/usr/src/app --rm python:v1 cv.py

     

    三、小结

    1、制作python镜像时报出来警告,说连接清华源超时,这里可以将connect timeout设置大一点

    WARNING: Retrying (Retry(total=4, connect=None, read=None, redirect=None, status=None)) after connection broken by 'ConnectTimeoutError(<pip._vendor.urllib3.connection.VerifiedHTTPSConnection object at 0x7fa0591bfd50>, 'Connection to pypi.tuna.tsinghua.edu.cn timed out. (connect timeout=15)')': /simple/pymysql/

    2、由于输出日历是交互式的,所以因为没有-it参数而导致报“EOF when reading a line”错误

     3、在制作镜像时由于没有添加cryptography,它在连接mysql数据库时报超时错误。mysql版本身份验证出现问题引起的(这里需要重构镜像)

    4、在Dockerfile文件内进行注释时,一定要记得另起一行注释,不要在行尾追加

    Step 3/7 : COPY requirements.txt ./  # 添加依赖声明文件
    COPY failed: stat /var/lib/docker/tmp/docker-builder452367450/#: no such file or directory
    Dockerfile以#开头的行视为注释,如果在有效指令后面使用#号注释,会将其作为参数处理,导致报错

     5、此次实验内容不算多,另外有前几次实验的基础,进度还算顺利。用时大概花了我一个下午完成实验加博客。

  • 相关阅读:
    ChineseAlphabetUtil获取汉字首字母工具类
    RandomCodeUtil随机数工具类,随机生成数字、字母、数字字母组合、中文姓名
    ValidateUtil常用验证工具类,如手机、密码、邮箱等
    聊天项目
    日期
    字符串
    java中属性,set get 以及如何学习类的一些用法
    继承 多态 封装
    方法 属性 构造方法和包
    面向对象知识
  • 原文地址:https://www.cnblogs.com/huckleberry/p/12906435.html
Copyright © 2011-2022 走看看