一、目的
a.快速把原有fastapi代碼部署到docker,讓docker在server運行。
b.不涉及docker深入設置。
c.使用python第三方lib少或簡單。
二、步驟
ps:請提前安裝docker
1.新建Dockerfile,放入到項目根目錄
a.Dockerfile沒有后綴.
b.準備好requirements.txt 文件。(在虛擬環境
pip freeze > requirements.txt
)
c.有些lib是比較特別和在pycharm導入的不一樣需要手動修改,如opencv。
d.CaseTemplateMatch.py是fastapi實現功能文件
Dockerfile:
# 使用python環境運行fastapi py文件
FROM python:3.9# Set the working directory to /app
#ENV PATH /usr/local/bin:$PATH
WORKDIR /app# Copy the current directory contents into the container at /app
ADD . /app# Install any needed packages specified in requirements.txt
RUN pip3 install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simpleRUN pip3 install opencv-python-headless -i https://pypi.tuna.tsinghua.edu.cn/simple# Make port 80 available to the world outside this container
EXPOSE 80# Define environment variable
ENV NAME World# Run app.py when the container launches
CMD ["python", "/app/CaseTemplateMatch.py"]
CaseTemplateMatch.py(部分)
import cv2
import numpy as np
from fastapi import FastAPI, File, UploadFile, Form
import uvicorn as uvicorn
import os
from starlette.responses import FileResponse
from pathlib import Path
import timeapp = FastAPI()@app.get("/copyFile/{fileName}")
async def copyFile(fileName: str):"""用于下載運行需要的工具,user用不到。文件預先放在server:param fileName::return:"""downloadFile = './tool/' + fileNamemy_file = Path(downloadFile)if my_file.is_file():printtimelog("dowload file"+fileName)return FileResponse(downloadFile, filename=fileName)if __name__ == '__main__':uvicorn.run(app=app, host="0.0.0.0", port=8084)
2.構建docker鏡像
docker build -t imamgeName .
?使用命令查找image是否存在
docker images
3.運行容器
docker run -d -p 8085:80 --name pytname pyti2
運行命令查看容器狀態
docker ps -a
4.瀏覽器訪問fastapi
四、掛載共享windows文件夾
1.運行命令
a.windows路徑直接絕對路徑,docker內路徑也需要絕對路徑。
b.可以不需要參數 -it,不顯示交互信息
docker run -v C:\testFile:/app/img -d -p 8087:80 --name pyshare4 pyti2
PS:有時莫名其妙不能掛載。考慮增加參數--restart always --privileged=true
2.進入docker查看
docker exec -it pyshare4 /bin/bash
ps:有時遇到進入后卡住的問題
參考:docker run -it 和 docker exec -it_wdadas的博客-CSDN博客
五、遇到問題與總結
a.當需要安裝python lib比較特別時,就需要很耗時查找,就不快速了。
b.可擴展性不高。
六、導入導出鏡像
鏡像image:save--load
docker save id(name)> /opt/docker/savesso.tardocker load < /opt/docker/savesso.tar
容器:export --import
要一一對應,否則報錯:
docker: Error response from daemon: No command specified.
參考:Docker 導入導出鏡像_bear_依舊。的博客-CSDN博客
參考:Docker實踐:python應用容器化 - 三只松鼠 - 博客園