第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用户是之前创建过的用户