項目結構
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 - 博客園