第5次实践作业

1.项目结构

├── app
│   ├── cvv.py
│   ├── date.py
│   ├── hello.py
│   ├── mysql1.py
│   ├── mysql2.py
│   ├── mysql3.py
│   ├── mysql4.py
│   ├── mysql5.py
│   ├── mysql6.py
│   └── test.jpg
├── Dockerfile
└── requirements.txt

2.搭建python镜像

  • (1)requirements.txt
PyMySQL
opencv-python
  • (2)Dockerfile
FROM python
MAINTAINER y00
WORKDIR /app     #工作目录
COPY ./requirements.txt /requirements.txt  #添加依赖文件
RUN pip install -r /requirements.txt -i https://pypi.douban.com/simple  #修改源并安装依赖
ENTRYPOINT [ "python" ]  # 实现命令行式调用容器
CMD [ "hello.py" ]  #设置ENTRYPOINT默认参数
  • (3)搭建镜像
sudo docker build -t docker-python .

3.简单程序的部署运行

  • (1)helloworld
# hello.py
print('hello world')
sudo docker run --rm -v /home/y00/docker-python/app:/app docker-python hello.py

  • (2)日历输出
# date.py
import calendar
yy = int(input("输入年份: "))
mm = int(input("输入月份: "))
print(calendar.month(yy,mm))
sudo docker run -it --rm -v /home/y00/docker-python/app:/app docker-python date.py

  • (3)mysql数据库操作

先开启一个数据库容器,可以用之前搭建好的

①测试数据库连接

#mysql1.py
#!/usr/bin/python3
 
import pymysql
 
# 打开数据库连接
db = pymysql.connect(host="192.168.0.110",user="docker",password="123456",database="docker_mysql" )

# 使用 cursor() 方法创建一个游标对象 cursor
cursor = db.cursor()
 
# 使用 execute()  方法执行 SQL 查询 
cursor.execute("SELECT VERSION()")
 
# 使用 fetchone() 方法获取单条数据.
data = cursor.fetchone()
 
print ("Database version : %s " % data)
 
# 关闭数据库连接
db.close()
sudo docker run --rm -v /home/y00/docker-python/app:/app --link=mysql1:mysql1 docker-python mysql1.py

②新建表

#mysql2.py
#!/usr/bin/python3
 
import pymysql
 
# 打开数据库连接
db = pymysql.connect(host="192.168.0.110",user="docker",password="123456",database="docker_mysql" )
 
# 使用 cursor() 方法创建一个游标对象 cursor
cursor = db.cursor()
 
# 使用 execute() 方法执行 SQL,如果表存在则删除
cursor.execute("DROP TABLE IF EXISTS EMPLOYEE")
 
# 使用预处理语句创建表
sql = """CREATE TABLE EMPLOYEE (
         FIRST_NAME  CHAR(20) NOT NULL,
         LAST_NAME  CHAR(20),
         AGE INT,  
         SEX CHAR(1),
         INCOME FLOAT )"""
 
cursor.execute(sql)
 
# 关闭数据库连接
db.close()
sudo docker run --rm -v /home/y00/docker-python/app:/app --link=mysql1:mysql1 docker-python mysql2.py

③表中插入数据

#mysql3.py
#!/usr/bin/python3
 
import pymysql
 
# 打开数据库连接
db = pymysql.connect(host="192.168.0.110",user="docker",password="123456",database="docker_mysql" )
 
# 使用cursor()方法获取操作游标 
cursor = db.cursor()
 
# SQL 插入语句
sql = """INSERT INTO EMPLOYEE(FIRST_NAME,
         LAST_NAME, AGE, SEX, INCOME)
         VALUES ('y00', '000', 20, 'F', 2000)"""
try:
   # 执行sql语句
   cursor.execute(sql)
   # 提交到数据库执行
   db.commit()
except:
   # 如果发生错误则回滚
   db.rollback()
 
# 关闭数据库连接
db.close()
sudo docker run --rm -v /home/y00/docker-python/app:/app --link=mysql1:mysql1 docker-python mysql3.py

④获取数据库某个表的记录

#mysql4.py
#!/usr/bin/python3
 
import pymysql
 
# 打开数据库连接
db = pymysql.connect(host="192.168.0.110",user="docker",password="123456",database="docker_mysql" )
 
# 使用cursor()方法获取操作游标 
cursor = db.cursor()
 
# SQL 查询语句
sql = "SELECT * FROM EMPLOYEE 
       WHERE INCOME > %s" % (1000)
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()
sudo docker run --rm -v /home/y00/docker-python/app:/app --link=mysql1:mysql1 docker-python mysql4.py

⑤将 表中 SEX 为 'M' 的 AGE 字段递增 1

#mysql5.py
#!/usr/bin/python3
 
import pymysql
 
# 打开数据库连接
db = pymysql.connect(host="192.168.0.110",user="docker",password="123456",database="docker_mysql" )

# 使用cursor()方法获取操作游标 
cursor = db.cursor()
 
# SQL 更新语句
sql = "UPDATE EMPLOYEE SET AGE = AGE + 1 WHERE SEX = '%c'" % ('M')
try:
   # 执行SQL语句
   cursor.execute(sql)
   # 提交到数据库执行
   db.commit()
except:
   # 发生错误时回滚
   db.rollback()
 
# 关闭数据库连接
db.close()
sudo docker run --rm -v /home/y00/docker-python/app:/app --link=mysql1:mysql1 docker-python mysql5.py

⑥删除数据表 EMPLOYEE 中 AGE 大于 20 的所有数据

#mysql6.py
#!/usr/bin/python3
 
import pymysql
 
# 打开数据库连接
db = pymysql.connect(host="192.168.0.110",user="docker",password="123456",database="docker_mysql" )
 
# 使用cursor()方法获取操作游标 
cursor = db.cursor()
 
# SQL 删除语句
sql = "DELETE FROM EMPLOYEE WHERE AGE > %s" % (20)
try:
   # 执行SQL语句
   cursor.execute(sql)
   # 提交修改
   db.commit()
except:
   # 发生错误时回滚
   db.rollback()
 
# 关闭连接
db.close()
sudo docker run --rm -v /home/y00/docker-python/app:/app --link=mysql1:mysql1 docker-python mysql6.py

  • (4)opencv程序

函数 cv2.moments() 会将计算得到的矩以一个字典的形式返回

#cvv.py
import cv2
import numpy as np

img = cv2.imread('test.jpg',0)
ret,thresh = cv2.threshold(img,127,255,0)
contours,hierarchy = cv2.findContours(thresh, 1, 2)

cnt = contours[0]
M = cv2.moments(cnt)
print (M)

4.出现的错误及解决方法

  • (1)部署日历输出程序出错

docker run 后面应加-it,表示声明需要交互式终端,然后才可以输入

  • (2)部署opencv程序出错

把程序命名成了cv2.py,这和python库中的程序命名相同,编译的时候会报错,把cv2.py改成cvv.py就可以了

5.时间花费

项目 时间(估算)
搭建镜像 30min
各个程序部署运行 3h
写博客 30min
原文地址:https://www.cnblogs.com/YU0000/p/12904703.html