项目结构
Python镜像搭建
pip
在requirements.txt
中声明这次实验所需依赖:
PyMySQL
opencv-python
为了提高依赖下载速度,修改pip.conf
,换为清华源:
[global]
index-url = https://pypi.tuna.tsinghua.edu.cn/simple
[install]
trusted-host = https://pypi.tuna.tsinghua.edu.cn
Dockerfile
FROM python
WORKDIR /usr/src/app # 设置工作目录
COPY ./pip.conf ~/.pip/pip.conf # 换源
COPY requirements.txt ./ # 添加依赖声明文件
RUN pip install --no-cache-dir -r requirements.txt # 安装依赖
ENTRYPOINT [ "python" ] # 实现命令行式调用容器
CMD [ "hello.py" ] # ENTRYPOINT默认参数
构建镜像
docker build -t my-py .
部署运行
hello world
# hello.py
print('hello world')
docker run --rm -v /home/qyanzh/h5/python/code:/usr/src/app my-py
参数说明
- 使用
-v
将本地目录挂载到python工作目录以方便代码修改 --rm
运行完毕后自动移除容器- 默认使用Dockerfile中指定的
hello.py
作为参数
日历
# date.py
import calendar
yy = int(input("输入年份: "))
mm = int(input("输入月份: "))
print(calendar.month(yy,mm))
docker run -it --rm -v /home/qyanzh/h5/python/code:/usr/src/app my-py date.py
参数说明
- 指定传给
ENTRYPOINT
的参数date.py
-it
声明需要交互式终端以读取输入(i for interactive, t for terminal),否则会出现下图错误
PyMySQL数据库操作
首先需要运行数据库服务器
# db.py
import pymysql
# 打开数据库连接
db = pymysql.connect("cdb", "qyanzh", "1234", "db_example")
# 使用 cursor() 方法创建一个游标对象 cursor
cursor = db.cursor()
# 使用 execute() 方法执行 SQL 查询
cursor.execute("SELECT VERSION()")
# 使用 fetchone() 方法获取单条数据.
data = cursor.fetchone()
print("Database version : %s " % data)
# 使用预处理语句创建表
sql = """CREATE TABLE IF NOT EXISTS EMPLOYEE (
FIRST_NAME CHAR(20) NOT NULL,
LAST_NAME CHAR(20),
AGE INT,
SEX CHAR(1),
INCOME FLOAT )"""
cursor.execute(sql)
# SQL 插入语句
sql = """INSERT INTO EMPLOYEE(FIRST_NAME,
LAST_NAME, AGE, SEX, INCOME)
VALUES ('Mac', 'Mohan', 20, 'M', 2000)"""
try:
# 执行sql语句
cursor.execute(sql)
# 提交到数据库执行
db.commit()
except:
# 如果发生错误则回滚
db.rollback()
# SQL 查询语句
sql = """SELECT * FROM EMPLOYEE"""
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()
docker run -it --rm -v /home/qyanzh/h5/python/code:/usr/src/app --link=cdb:cdb my-py db.py
参数说明
--link=容器名:容器别名
命令可以实现容器间的互访(也可以用其他方式实现),否则由于容器间的隔离性,py容器会找不到数据库容器
OpenCV
以下代码实现了将图片旋转90度并保存的操作:
# cv.py
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 --rm -v /home/qyanzh/h5/python/code:/usr/src/app my-py cv.py
可以看到目录下多出了OpenCV生成的test-rotated.jpg
。
用时与心得
作业内容约2小时,博客0.5小时。经过前几次的历练,这次作业显得比较容易,看到要安装依赖时已经形成条件反射,先去找怎么给pip换源了(手动狗头)。
参考
第5次实践作业 - 作业 - 2017级系统综合实践 - 班级博客 - 博客园
Ubuntu环境的docker实践——python - 旺得福000 - 博客园
python requirements文件生成与使用 - 简书
将pip源更换到国内镜像_python_LittleBee的博客-CSDN博客
6 Dockerfile指令详解 && ENTRYPOINT 指令 - tengq - 博客园
Python3 MySQL 数据库连接 – PyMySQL 驱动 | 菜鸟教程
OpenCV-Python 中文教程(搬运)目录 - _Undo - 博客园