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 .

build

部署運行

hello world

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

hello

參數說明

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

date2

參數說明

  • 指定傳給ENTRYPOINT的參數date.py
  • -it聲明需要交互式終端以讀取輸入(i for interactive, t for terminal),否則會出現下圖錯誤date1

PyMySQL數據庫操作

首先需要運行數據庫服務器

db

# 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

sql2

參數說明

  • --link=容器名:容器別名命令可以實現容器間的互訪(也可以用其他方式實現),否則由於容器間的隔離性,py容器會找不到數據庫容器sql1

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

cv

cv效果

用時與心得

作業內容約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+ - 博客園


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM