第一次采用docker部署python项目(该项目是基于win10环境下安装好的face_recognition开发完成),竟然遇到了光是部署环境就差点把人劝退的face_recognition。搞了几天终于部署好了,因此记录一下整个过程。
python人脸识别项目是在windows10上采用pycharm工具编写完成,运用face_recognition包进行人脸识别。该包依赖的dlib安装的是dlib-19.7.0版本,其他配套的环境python:3.6,opencv-python:3.4.2.16,opencv-contrib-python:3.4.2.16,numpy:1.16.0.
下面准备将在win10系统下完成的python项目部署到centos7系统的服务器中。
下面将展开requirements的生成和Dockerfile的编写。
我用的pycharm,直接在terminal下面输入,即可生成该py文件需要的包及版本号:
pip freeze > requirements.txt
在生成的requirements.txt可能包含很多依赖,这时得按照项目需要手动删掉一些不需要的依赖包。
自己编写Dockerfile时,遇到了很多坑,主要集中在face_recogniton的环境搭建上。
face_recognition包依赖于dlib环境,而在win10环境下安装的dlib-19.7.0-cp36-cp36m-win_amd64.whl不需要安装cmake和boost即可运行。但在linux环境下,没有linux版本的whl,对应的dlib-19.7.0.tar.gz需要cmake和boost环境的支撑。因此,在Dockerfile中直接写了
RUN pip install cmake -i https://pypi.tuna.tsinghua.edu.cn/simple/
RUN pip install boost -i https://pypi.tuna.tsinghua.edu.cn/simple/
RUN pip install dlib
虽然cmake和boost会提示成功安装,但在安装face_recognition时直接报错,说boost找不到:
为了解决该问题找了各种方法,如去boost.org官网下载新版本的boost(国内镜像源只有boost-0.1.tar.gz),并按照相应的安装步骤试图直接安装,但又提示./b2找不到。
不知点开了多少网页终于得知,dlib在19.9.0版本后不需要依赖boost,只需要cmake即可应用,瞬间燃起了希望之火,而后又查阅一些成功将face_recognition上传到docker里的Dockerfile,一触即发成功安装。
下面直接展示成功的Dockerfile内容。
# docker基础环境
FROM python:3.6
# 将当前目录的文件拷贝到face_recognition文件中
COPY . /face_recognition
# 设置工作目录为face_recognition文件夹
WORKDIR /face_recognition
# 安装依赖环境(虽然是centos系统,但不会影响安装)
RUN apt-get update -y
RUN apt-get install -y \
git \
cmake \
libsm6 \
libxext6 \
libxrender-dev \
python3 \
python3-pip \
gcc \
python3-tk \
libopenblas-dev \
liblapack-dev
# 安装dlib
RUN git clone git://github.com/davisking/dlib.git && \
cd dlib && \
mkdir build && \
cd build && \
cmake .. && \
cmake --build . && \
cd .. && \
python3 setup.py install
# 安装Face Recognition和OpenCV,指定国内镜像源,这样下载速度快些
RUN pip3 install face_recognition -i https://pypi.douban.com/simple/
RUN pip3 install opencv-python -i https://pypi.douban.com/simple/
# 安装requirements里的其他安装包
RUN pip install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple/
# 采用Python运行img_face_code_pickle.py(这里可以修改为你要运行的py文件)
CMD ["python", "img_face_code_pickle.py"]
因为虚拟机上安装的是centos7无桌面版本,所以借助FinalShell工具来将windows上的Python文件上传到虚拟机。具体操作如下:
#1、查看虚拟机ip地址
ifconfig
找到ens33对应的inet(图中红框标记处)为本机IP地址。
FinalShell连接虚拟机
打开FinalShell,创建新的SHH连接,输入虚拟机的ip地址、用户名及密码,即可连接成功。
FinalShell上传文件
打开连接。首先,在root目录下创建一个文件用以存放Python项目,并进入到文件中。
# 1、创建文件
mkdir pythonFile
#2、进入文件
cd pythonFile
然后将windows上的Python文件拖拽到pythonFile中,即可完成文件的上传。
进入Dockerfile文件所在的根目录,我这里是docker_recognition目录
[root@localhost ~]# cd pythonFile
[root@localhost pythonFile]# ls
docker_recognition
[root@localhost pythonFile]# cd docker_recognition
[root@localhost docker_recognition]# ls
dbTableGen.py Dockerfile img_face_code_pickle.py model.py requirements.txt
在该目录下,创建docker镜像
docker build -t img_face_recognition . # . 表示当前路径
整个创建过程会比较漫长,耐心等待。。。最后若创建成功会有Successfully built xxxxx提示语。
创建完成后,查看docker镜像,输入
docker images
即可看到创建好的face_recognition镜像
运行镜像
docker run img_face_recognition
得到结果,因为在Dockerfile中写了CMD运行指令,所以可直接得到CMD中py文件的结果。
若Dockerfile中未写CMD指令,要运行Python项目。首先cd进入到python项目所在根目录,然后在终端完成以下步骤:
docker run -itd img_face_recognition
docker ps
docker exec -it 容器id /bin/bash
python 文件名.py