使用docker容器運行Python程序


本文主要闡述基於python鏡像和mysql鏡像,利用docker容器搭建python3的系統環境,並運行簡單的python程序

一.Python鏡像的構造文件、Python程序代碼

1️⃣ python鏡像的python3_dockerfile

#基礎鏡像
FROM python:3

#作者信息
MAINTAINER lxc

#工作目錄
WORKDIR /usr/src/app

#復制文件到容器中
COPY requirements.txt ./
RUN pip install --no-cache-dir -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple

COPY . .

ps:由於直接pip速度較慢,這里使用了清華源鏡像加速-i https://pypi.tuna.tsinghua.edu.cn/simple

2️⃣ 記錄python依賴的文件:requirement.txt

numpy==1.18.4
opencv-python==4.2.0.34
PyMySQL==0.9.3

生成方法:在本機編寫代碼調試程序后,在python代碼所在目錄下,使用命令:pip freeze > requirements.txt,即可在該目錄下生成requirement.txt文件。(參考鏈接

👇

👇

3️⃣ python程序

①. 簡單測試程序HelloWord.py

print("Hello World!")

②. 簡單日歷顯示程序Calander.py

# Filename : test.py
# author by : www.runoob.com
 
# 引入日歷模塊
import calendar
 
# 輸入指定年月
yy = int(input("輸入年份: "))
mm = int(input("輸入月份: "))
 
# 顯示日歷
print(calendar.month(yy,mm))

參考Pyhton生成日歷

③. 簡單數據庫操作程序MySql.py

import pymysql
import time
# 打開數據庫連接。connec參數依次為"容器IP或虛擬機IP","用戶名","密碼","數據庫名稱",字符集編碼格式
db = pymysql.connect("localhost", "root", "6666", "user", charset='utf8mb4' )

# 使用 cursor() 方法創建一個游標對象 cursor
cursor = db.cursor()
 
# 使用 execute() 方法執行 SQL,如果表存在則刪除
cursor.execute("DROP TABLE IF EXISTS myuser")
 
# 使用預處理語句創建表
sql = """CREATE TABLE myuser (
         FIRST_NAME  CHAR(20) NOT NULL,
         LAST_NAME  CHAR(20),
         AGE INT,  
         SEX CHAR(1) )"""
try:
   # 執行SQL語句
   cursor.execute(sql)
   # 提交到數據庫執行
   db.commit()
except:
   # 如果發生錯誤則回滾
   db.rollback()

# 增 
sql = "INSERT INTO myuser(FIRST_NAME,LAST_NAME, AGE, SEX) VALUES (%s, %s, %s, %s)"
data = (('Xin', 'Lin', 23, 'M'),('Yun', 'Ma', 50, 'M'))
try:
   # 執行多條sql語句
   cursor.executemany(sql, data)
   # 提交到數據庫執行
   db.commit()
except:
   # 如果發生錯誤則回滾
   db.rollback()

#查
sql = "SELECT * FROM myuser"
try:
   # 執行SQL語句
   cursor.execute(sql)
   # 獲取所有記錄列表
   results = cursor.fetchall()
   print("插入數據:")
   for row in results:
      fname = row[0]
      lname = row[1]
      age = row[2]
      sex = row[3]
      # 打印結果
      print ("fname=%s,lname=%s,age=%s,sex=%s" % (fname, lname, age, sex))
except:
   print ("Error: unable to fetch data")

#改
sql = "UPDATE myuser SET AGE = AGE + 1 WHERE SEX = '%c'" % ('M')
try:
   # 執行SQL語句
   cursor.execute(sql)
   # 提交到數據庫執行
   db.commit()
except:
   # 發生錯誤時回滾
   db.rollback()

#查
sql = "SELECT * FROM myuser"
try:
   # 執行SQL語句
   cursor.execute(sql)
   # 獲取所有記錄列表
   results = cursor.fetchall()
   print("修改年齡:")
   for row in results:
      fname = row[0]
      lname = row[1]
      age = row[2]
      sex = row[3]
      # 打印結果
      print ("fname=%s,lname=%s,age=%s,sex=%s" % (fname, lname, age, sex))
except:
   print ("Error: unable to fetch data")

#查
sql = "SELECT * FROM myuser WHERE AGE = 24"
try:
   # 執行SQL語句
   cursor.execute(sql)
   # 獲取所有記錄列表
   results = cursor.fetchall()
   print("刪除記錄:")
   for row in results:
      fname = row[0]
      lname = row[1]
      age = row[2]
      sex = row[3]
      # 打印結果
      print ("fname=%s,lname=%s,age=%s,sex=%s" % (fname, lname, age, sex))
except:
   print ("Error: unable to fetch data")
   
#刪
sql = "DELETE FROM myuser WHERE AGE = 24" 
try:
   # 執行SQL語句
   cursor.execute(sql)
   # 提交修改
   db.commit()
except:
   # 發生錯誤時回滾
   db.rollback()   

#查
sql = "SELECT * FROM myuser"
try:
   # 執行SQL語句
   cursor.execute(sql)
   # 獲取所有記錄列表
   results = cursor.fetchall()
   print("最后結果:")
   for row in results:
      fname = row[0]
      lname = row[1]
      age = row[2]
      sex = row[3]
      # 打印結果
      print ("fname=%s,lname=%s,age=%s,sex=%s" % (fname, lname, age, sex))
except:
   print ("Error: unable to fetch data")
   
# 關閉數據庫連接
db.close()

參考Python3 MySQL數據庫連接

④. 簡單圖像操作程序poenvc.py

import cv2
import numpy as np
img=cv2.imread('test.jpg')
print(img.shape) #返回圖像屬性:行數,列數,通道數的元組
print(img.size, img.dtype) # 返回的是圖像的數據類型.

block=img[70:120,80:120]
img[0:50,0:40]=block
img=cv2.imshow('test', img)
cv2.waitKey(0)

參考opencv圖像的基本操作中的9.2 獲取圖像屬性、9.3 圖像 ROI

ps:mysql的構建使用的是上一篇博客中構建的mysql(也可以使用mysql官方鏡像

⑤. 文件結構

├── Calander.py
├── HelloWorld.py
├── MySql.py
├── opencv.py
├── python3_dockerfile
├── requirements.txt
└── test.jpg

二.Python3鏡像構建

使用命令:docker build -t python3 -f ./python3_dockerfile .,構建過程如下:

三.運行測試

1️⃣ 運行HelloWorld.py

命令:docker run -it --rm --name python3_container -v "$PWD":/usr/src/myapp -w /usr/src/myapp python3 python HelloWorld.py

結果:

2️⃣ 運行Calander.py

命令:docker run -it --rm --name python3_container -v "$PWD":/usr/src/myapp -w /usr/src/myapp python3 python Calander.py

結果:

3️⃣ 運行MySql.py

命令:docker run -it --rm --name python3_container -v "$PWD":/usr/src/myapp -w /usr/src/myapp python3 python MySql.py

運行時出錯:

錯誤原因:mysql版本身份驗證出現問題引起

解決方法:進入pyhton3容器中安裝cryptography,然后commit成鏡像(或者在dockerfile中添加cryptography的安裝),再運行新的鏡像。

具體過程:

①. 使用命令docker run --name python3_container -v "$PWD":/usr/src/myapp -w /usr/src/myapp -it python3 bash,交互式啟動python3,進入容器:

②. 在容器中安裝cryptography:pip install cryptography -i https://pypi.tuna.tsinghua.edu.cn/simple

在這里可以直接運行:

③. commit成鏡像,commit命令:docker commit python3_container python3_lxc

④. 再次運行,運行命令:docker run -it --rm --name python3_container -v "$PWD":/usr/src/myapp -w /usr/src/myapp python3_lxc python MySql.py

4️⃣ 運行opencv.py

由於docker中顯示圖像比較繁瑣,這里的圖像是在本機跑出來的,運行的時候可以把有關圖像顯示的內容注釋掉或者去掉:

import cv2
import numpy as np
img=cv2.imread('test.jpg')
print(img.shape) #返回圖像屬性:行數,列數,通道數的元組
print(img.size, img.dtype) # 返回的是圖像的數據類型.

#block=img[70:120,80:120]
#img[0:50,0:40]=block
#img=cv2.imshow('test', img)
#cv2.waitKey(0)

結果:

在本機windows系統上運行有關圖片顯示部分的結果,效果為截取表情包中熊貓人的嘴型放到圖片左上角:

四.小結

這次實踐+編寫博客花費了大概有5個小時的時間。實踐難度不大,主要是圍繞python鏡像進行簡單的環境配置和運行測試。根據教程按部就班,過程很順暢。做完這次實踐,第一是學到了Python requirement文件的創建和使用,體會到了requirement作用:requirement作用是記錄python程序依賴包,在鏡像構建時通過pip安裝requirement中記錄的依賴,從而節省了手動下載依賴的繁瑣步驟。其次是初步了解了python的opencv,通過一些簡單的圖片操作體會了opencv的作用。總的來說,一路通暢,收獲滿滿!😀😀


免責聲明!

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



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