Docker打包OpenCV Python程序
Docker
Docker 是一个开源的应用容器引擎,基于 Go 语言 并遵从 Apache2.0 协议开源。Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口(类似 iPhone 的 app),更重要的是容器性能开销极低。
打包过程
- pip freeze > requirements.txt
- 编写dockerfile,需要注意的是这里安装了一些c++库文件供opencv使用,让笔者在打包时吃了一些苦头
# 将官方 Python 运行时用作父镜像
FROM python:3.9-slim
# 将工作目录设置为 当前目录
WORKDIR .
# 将当前目录内容复制到容器中
ADD . .
RUN apt-get update
RUN apt install -y g++
RUN apt install -y cmake
RUN apt install -y make
RUN apt install -y wget unzip
RUN apt-get -y install build-essential libgtk2.0-dev libgtk-3-dev libavcodec-dev libavformat-dev libjpeg-dev libswscale-dev libtiff5-dev
# 安装 requirements.txt 中指定的任何所需软件包
RUN pip install -r requirements.txt
# 定义环境变量
#ENV NAME World
# 在容器启动时运行 main.py
CMD ["python", "main.py"]
#CMD ["python","./apps/min.py","worker","-l","info"] ##faust程序worker启动命令
#指令是声明运行时容器提供服务端口,这只是一个声明,在运行时并不会因为这个声明应用就会开启这个端口的服务
EXPOSE 5005
- docker根据Dockerfile构建镜像
docker build -f Dockerfile -t qrdetect:1.1 .
- 根据名称为qrdetect:1.1的镜像运行名称为qr的容器,暴露容器内的端口5005为对外8081的端口
docker run --name qr -p 8081:5005 -d qrdetect:1.1
docker实用命令
由于经验问题,我们可能会要经常使用一些镜像和容器命令
- 列出容器id
docker ps -a
- 列出id为xx容器的日志
+ docker logs id
- 列出镜像id
docker image ls
- 删除指定id镜像
docker rmi id
- 删除指定id容器
docker rm id
- 停止运行指定id容器
docker stop id
- 导出指定id镜像
docker save -o qrdetect.tar 483128b19e21
- 加载指定id镜像
docker load --input qrdetect2.tar
- 导入指定id容器
docker import qrdetect.tar qr:1.1
- 导出指定id容器
docker export bf2358939836 > qrdetect.tar
经验教训
最好不用wsl进行打包,问题比较多,还是直接linux环境打包比较好
参考资料:
https://dennislwm.netlify.app/posts/installing-minikube-on-ubuntu-with-wsl-backend/
https://zhuanlan.zhihu.com/p/272541376
https://answers.microsoft.com/zh-hans/windows/forum/all/win11如何关闭hyper-v/25b2974d-80e5-44e6-9e78-6fbd8e3e519f
https://docs.docker.com/engine/install/ubuntu/
https://zhuanlan.zhihu.com/p/53707590
https://blog.csdn.net/foreverhot1019/article/details/102725793
https://blog.csdn.net/weixin_44796670/article/details/115900538