linux系統 docker封裝打包python程序


有時候我們需要將我們的程序成為“熱插拔”,也就是別人打開開關就運行,關閉就不運行,docker容器相當於一個盒子,這個盒子有個開關,我們只要讓我們的程序一直運行在docker容器里面,即可實現。docker創建容器,容器里面需要配置我們的程序所需要的環境,還需要放我們的程序的鏡像,讓鏡像一直在容器中運行,然后通過docker啟動或者停止容器來實現“熱插拔”,(熱插拔是我自己起的名字,我覺得跟網絡那里的概念有點像)

首先就是下載docker,根據版本自行下載。在封裝進入docker之前,你的程序一定是可以在本地(即你的電腦)跑通的。
然后將我們的項目,比如就叫A項目,把所有文件放在A文件夾下,且A文件夾里面放運行的py文件,如,run.py
此時,在A文件夾下執行終端命令:pip3 freeze > requirement.txt    ## 這個可以產生你的項目中所有需要的依賴包及其版本
然后就是編寫Dockerfile,必須是這個名字,這個文件就是將你的代碼打包進入docker(即build操作),docker唯一編譯的文件,所以所有文件都寫到這里。

[我建議,將你的項目文件夾(就是A文件夾)重新放在一個新的文件夾下(如A_docker),在A_docker文件夾下放A文件夾和Dockerfile文件]

### 編寫Dockerfile

FROM python:3.8       # 拉取一個基礎鏡像,這樣我們的項目可以在這個基礎鏡像使用,比如簡單的import time math這些包都是有的
MAINTAINER tianye     # 維護者信息
ADD ./A/ /code/A/       # 將你的項目文件放到docker容器的/code/A文件夾,這里code是在根目錄的,與usr  opt  etc等等在一個目錄,而且必須是/code/A/ 如果不加/A/ 那么你本地A文件夾里面的所有東西將直接放到code文件夾下,會導致目錄結構亂,如果你還導入了自己寫的程序,那么會報錯。
RUN cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && echo 'Asia/Shanghai' >/etc/timezone    # 設置容器時間,有的容器時間是西方時間,跟我們本地相差8小時!
ENV LANG C.UTF-8      # 設置語言為utf-8
ENV PATH=$PATH:/usr/local/lib/python3.8/   
ENV PYTHONPATH $PATH    # 將python路徑加入到環境變量
WORKDIR /code/A      # 設置工作目錄
RUN pip3 install --default-timeout=1000 -r requirements.txt  # 根據requirement.txt下載好依賴包
EXPOSE 9090          # 暴漏端口,使得容器可以訪問第三方網址,比如百度  阿里,這個端口是自己設置的,只要跟別的容器的端口不沖突即可。
CMD "python3""run.py""runserver" "0.0.0.0:9090"  # 啟動項目,CMD最好只寫一個

 

 現在Dockerfile已經寫完了,在運行RUN pip3 install --default-timeout=1000 -r requirements.txt的時候可能會報錯,如果下載的時候,提示找不到包,那么只能下載到本地,建議下載.whl文件,我是這么干的,我把所有需要的包手動下載,放到與Dockerfile一個目錄下,
然后編寫Dockerfile 的時候,把上面第7行RUN pip3 install --default-timeout=1000 -r requirements.txt 換成   ADD redis-3.5.3-py2.py3-none-any.whl /usr/local/lib/python3.8/   ADD PyMySQL-0.10.1-py2.py3-none-any.whl /usr/local/lib/python3.8/   RUN pip3 install /usr/local/lib/python3.8/*.whl
也可以成功配置環境。如果沒有對應的.whl文件,只有.tar.gz文件,那么就別指望用tar -zxvf *.tar.gz解壓了,python3 */setup.py install 安裝成功了,基本8可能。此時還是使用最簡單的 RUN pip3 install * 下載吧 ,比如DBUtils就沒有whl文件,運行RUN pip3 install DBUtils居然成功了!感謝主!

### 然后制作鏡像並啟動容器

docker build -t imagename Dockerfilepath
# imagename為給你的程序的鏡像名字,Dockerfilepatheg為所在文件夾名稱,當前名錄為 “.”
# eg:docker build -t A_image .
docker run -it -p 0.0.0.0:9090:9090 -d --name A_container A_image #在容器中運行鏡像 -p用來指定端口,-d:以后台方式運行容器,返回容器ID,即以守護進程方式啟動 --name:容器名字
docker logs -f --tail 200 A_container  #查看日志,-f:跟蹤日志輸出  -t:顯示時間戳  --tail:僅列出最新的N條容器日志

 

最后如果還是不能訪問第三方網址,那么等docker所有容器都不在測試的狀態,重新啟動docker。 systemctl start docker

 


免責聲明!

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



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