第5次实践作业

1.构建python镜像

项目目录

dockerfile 文件

FROM python:3
#工作目录
WORKDIR /usr/src/app
# 添加依赖声明文件
COPY ./requirements.txt ./requirements.txt 
# 安装依赖,换清华源
RUN pip install --no-cache-dir -i https://pypi.tuna.tsinghua.edu.cn/simple -r requirements.txt
COPY myapp/hello.py /usr/src/app/ 
VOLUME /usr/src/app
ENTRYPOINT ["python"]
# 默认打开文件
CMD ["hello.py"]

py.conf

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

requirements.txt

PyMySQL
opencv-python

构建镜像

docker build -t mypython .

2.部署运行

2.1 hello world

hello.py

print('hello world')

无交互式输入
Dockerfile已经把helloworld代码拷进容器了,所以后面不需要附加py文件名
由于程序运行完就结束了,所以在得到结果之后可以用--rm 删掉容器。

docker run -v /home/linrui/python/myapp:/usr/src/app --rm mypython

2.2 日历输出

date.py

# 引入日历模块
import calendar
# 输入指定年月
yy = int(input("输入年份: "))
mm = int(input("输入月份: "))
# 显示日历
print(calendar.month(yy,mm))
docker run -v /home/linrui/python/myapp:/usr/src/app --rm mypython date.py

2.3 mysql数据库操作

运行之前的mysql容器,给mysql数据库添加一个远程连接的用户

docker exec -it lrsql5 /bin/bash   #进入容器内部
docker mysql -u docker -p
grant all privileges on *.*  to 'docker'@'%' ;   # 给用于授予权限
flush privileges;  # 刷新权限

MySQL.py

import pymysql
 
# 打开数据库连接,localhost替换成ip地址,后面依次是用户名,密码,数据库名
db = pymysql.connect("10.0.2.15","docker","123456","docker_mysql" )
 
# 使用 cursor() 方法创建一个游标对象 cursor
cursor = db.cursor()
 
# 使用 execute()  方法执行 SQL 查询 
cursor.execute("SELECT VERSION()")
 
# 使用 fetchone() 方法获取单条数据.
data = cursor.fetchone()
 
print ("Database version : %s " % data)
 
# 关闭数据库连接
db.close()

执行以上脚本

创建数据库表

import pymysql
 
# 打开数据库连接
db = pymysql.connect("10.0.2.15","docker","123456","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()

进入容器查看

数据库插入操作

import pymysql
 
# 打开数据库连接
db = pymysql.connect("10.0.2.15","docker","123456","docker_mysql")
 
# 使用cursor()方法获取操作游标 
cursor = db.cursor()
 
# SQL 插入语句
sql = """INSERT INTO EMPLOYEE(FIRST_NAME,
         LAST_NAME, AGE, SEX, INCOME)
         VALUES ('LIN', 'Linrui', 20, 'W', 10000)"""
try:
   # 执行sql语句
   cursor.execute(sql)
   # 提交到数据库执行
   db.commit()
except:
   # 如果发生错误则回滚
   db.rollback()
 
# 关闭数据库连接
db.close()


数据库查询操作

import pymysql
 
# 打开数据库连接
db = pymysql.connect("10.0.2.15","docker","123456","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()

2.4 opencv程序

opencv.py

# 仿射变换
import cv2
import numpy as np
img = cv2.imread('picture.jpg')
rows,cols,ch = img.shape
pts1 = np.float32([[50,50],[200,50],[50,200]])
pts2 = np.float32([[10,100],[200,50],[100,250]])
M = cv2.getAffineTransform(pts1,pts2)
dst = cv2.warpAffine(img,M,(cols,rows))
# 写入文件
cv2.imwrite("picture_new.jpg", dst, [int(cv2.IMWRITE_JPEG_QUALITY), 100])

3.总结

花费时间:3小时+博客1小时
遇到的问题:

1.构建python镜像copy不成功

Dockerfile以#开头的行视为注释,如果在有效指令后面使用#号注释,会将其作为参数处理,导致报错,解决方法:将注释去掉或者把注释单独放一行

2.运行日历输出的程序时出现AttributeError: module 'calendar' has no attribute 'month'


本地保存了名为calendar.py的文件,导致与python中的类calendar冲突,将calendar.py文件重命名就解决此问题了

3.部署mysql数据库连接不上


解决方法:要先添加远程连接用户,参考上面步骤,注意docker用户是之前创建过的用户

posted @ 2020-05-20 09:41  Lrrui  阅读(193)  评论(0编辑  收藏  举报