项目结构

2020系统综合实践5 使用Docker部署Python运行环境

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 .

2020系统综合实践5 使用Docker部署Python运行环境

部署运行

hello world

# hello.py
print('hello world')
docker run --rm -v /home/qyanzh/h5/python/code:/usr/src/app my-py

2020系统综合实践5 使用Docker部署Python运行环境

参数说明

  • 使用-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

2020系统综合实践5 使用Docker部署Python运行环境

参数说明

  • 指定传给ENTRYPOINT的参数date.py
  • -it声明需要交互式终端以读取输入(i for interactive, t for terminal),否则会出现下图错误2020系统综合实践5 使用Docker部署Python运行环境

PyMySQL数据库操作

首先需要运行数据库服务器

2020系统综合实践5 使用Docker部署Python运行环境

# 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

2020系统综合实践5 使用Docker部署Python运行环境

参数说明

  • --link=容器名:容器别名命令可以实现容器间的互访(也可以用其他方式实现),否则由于容器间的隔离性,py容器会找不到数据库容器2020系统综合实践5 使用Docker部署Python运行环境

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

2020系统综合实践5 使用Docker部署Python运行环境

2020系统综合实践5 使用Docker部署Python运行环境

用时与心得

作业内容约2小时,博客0.5小时。经过前几次的历练,这次作业显得比较容易,看到要安装依赖时已经形成条件反射,先去找怎么给pip换源了(手动狗头)。

参考

第5次实践作业 - 作业 - 2017级系统综合实践 - 班级博客 - 博客园

python - Docker Hub

Ubuntu环境的docker实践——python - 旺得福000 - 博客园

python requirements文件生成与使用 - 简书

将pip源更换到国内镜像_python_LittleBee的博客-CSDN博客

Python 生成日历 | 菜鸟教程

6 Dockerfile指令详解 && ENTRYPOINT 指令 - tengq - 博客园

Python3 MySQL 数据库连接 – PyMySQL 驱动 | 菜鸟教程

Docker容器互访三种方式 - 三只松鼠 - 博客园

OpenCV-Python 中文教程(搬运)目录 - _Undo - 博客园

(一)OpenCV-Python学习—基础知识 - silence_cho - 博客园

opencv 图片旋转 - MARK+ - 博客园

分类:

技术点:

相关文章: