使用Docker将PyQt深度学习项目打包成镜像

前言

由于项目原因,需要学习将深度学习项目打包成docker镜像,所以本文将使用一个封装了yolo的PyQt项目为例,展示如何将此项目打包成docker镜像。

安装docker

通过官方源安装:

复制代码
curl -fsSL https://get.docker.com -o get-docker.sh

sudo sh get-docker.sh

如果上面的方法失败就采用下面的指令:

复制代码
sudo apt install -y docker.io

安装好后,将当前用户添加到 docker 组(避免每次使用 sudo)

复制代码
sudo usermod -aG docker $USER

然后重新登录或刷新组权限

复制代码
newgrp docker

docker的基本命令

查看docker版本

复制代码
docker --version

例如我这里是

Docker version 28.4.0, build d8eb465

查看所有的docker镜像,这里只有我先前已经创建好的镜像

复制代码
docker images

将该路径建立为docker镜像

复制代码
docker build -t xxx .

运行docker镜像

复制代码
docker run xxx

查看运行中的镜像

复制代码
docker ps -a

Dockerfile

Dockerfile文件是指导docker进行打包的文档,主要有以下部分:

FROM:制定运行环境

WORKDIR:制定工作目录

COPY:拷贝指令

RUN:预运行指令

CMD:CMD运行指令

下面给出我的项目的Dockerfile仅供参考:

python 复制代码
FROM ubuntu:20.04

ENV DEBIAN_FRONTEND=noninteractive
ENV PYTHONUNBUFFERED=1
ENV QT_DEBUG_PLUGINS=0
ENV USE_FLASH_ATTN=0
ENV PYTHONPATH=/app
ENV XDG_RUNTIME_DIR=/tmp/runtime-root
ENV LANG=zh_CN.UTF-8
ENV DISPLAY=:0

# 在Ubuntu 20.04中安装Python 3.8和基本环境依赖
RUN apt-get update && apt-get install -y \
    python3 \
    python3-pip \
    python3-pyqt5 \
    python3-pyqt5.qtwebengine \
    language-pack-zh* \
    ttf-wqy-microhei \
    x11-apps \
    && rm -rf /var/lib/apt/lists/*

# 升级pip并设置工作目录
RUN python3 -m pip install -U pip setuptools wheel
WORKDIR /app

# 复制requirements.txt并安装Python依赖
COPY requirements.txt ./
RUN pip install -r requirements.txt

# 复制应用程序代码
COPY . .

# 中文编码设置
RUN locale-gen zh_CN.UTF-8 && \
    update-locale LANG=zh_CN.UTF-8 LANGUAGE=zh_CN.UTF-8 LC_ALL=zh_CN.UTF-8

# 确保settings.json文件存在并设置权限
RUN mkdir -p /app/data && \
    if [ ! -f /app/data/settings.json ]; then \
        echo "{}" > /app/data/settings.json; \
    fi && \
    chmod 666 /app/data/settings.json

# 创建运行时目录
RUN mkdir -p /tmp/runtime-root && chmod 700 /tmp/runtime-root

# 设置入口点
CMD ["python3", "main.py"]

运行本地文件

YOLO_UI/

├── Dockerfile

├── .dockerignore

├── requirements.txt

├── main.py

└── ui/

├── main_window.py

├── init.py

├── assets/

├── tabs/

│ ├── init.py

│ ├── dataset_splitter_tab.py

│ ├── image_quality_yab.py

│ ├── inference_tab.py

│ ├── settings_tab.py

│ ├── testing_tab.py

│ └── training_tab.py

└── utils/

├── init.py

├── console.py

├── error.py

├── file.py

├── infer.py

├── splash_screen.py

├── tester.py

├── theme.py

└── trainer.py

我这里的pyqt的一个项目,直接运行 python main.py文件会报错,根据报错提示,采用下面的指令运行成功。

复制代码
QT_QPA_PLATFORM=wayland python main.py

可以正常的打开了界面了。

docker换源

如果编译这一步走不通,一般都是镜像源的问题:备用源1,备用源2,备用源3。这里提供了三个,我使用第一个就通过了。如果拉取镜像还是网络问题,请切换其他的网络,或者是手机流量均可。

python 复制代码
sudo tee /etc/docker/daemon.json <<-'EOF'
{
    "registry-mirrors": [
     "https://docker.m.daocloud.io",
     "https://docker.imgdb.de",
     "https://docker-0.unsee.tech",
     "https://docker.hlmirror.com",
     "https://docker.1ms.run",
     "https://func.ink",
     "https://lispy.org",
     "https://docker.xiaogenban1993.com"
    ]
}
EOF
python 复制代码
sudo tee /etc/docker/daemon.json <<'EOF'
{
  "registry-mirrors": [
    "https://docker.rainbond.cc",
    "https://docker.registry.cyou/",
    "https://docker-cf.registry.cyou/",
    "https://dockercf.jsdelivr.fyi/",
    "https://docker.jsdelivr.fyi/",
    "https://dockertest.jsdelivr.fyi/",
    "https://mirror.aliyuncs.com/",
    "https://dockerproxy.com/",
    "https://mirror.baidubce.com/",
    "https://docker.m.daocloud.io/",
    "https://docker.nju.edu.cn/",
    "https://docker.mirrors.sjtug.sjtu.edu.cn/",
    "https://docker.mirrors.ustc.edu.cn/",
    "https://mirror.iscas.ac.cn/",
    "https://docker.rainbond.cc/",
    "https://jq794zz5.mirror.aliyuncs.com"
  ]
}
EOF
python 复制代码
sudo tee /etc/docker/daemon.json <<'EOF'
{
  "registry-mirrors": [
    "https://docker.registry.cyou",
    "https://docker-cf.registry.cyou",
    "https://dockercf.jsdelivr.fyi",
    "https://docker.jsdelivr.fyi",
    "https://docker.rainbond.cc",
    "https://dockertest.jsdelivr.fyi",
    "https://mirror.aliyuncs.com",
    "https://dockerproxy.com",
    "https://mirror.baidubce.com",
    "https://docker.m.daocloud.io",
    "https://docker.nju.edu.cn",
    "https://docker.mirrors.sjtug.sjtu.edu.cn",
    "https://docker.mirrors.ustc.edu.cn",
    "https://mirror.iscas.ac.cn",
    "https://docker.rainbond.cc",
    "https://do.nark.eu.org",
    "https://dc.j8.work",
    "https://gst6rzl9.mirror.aliyuncs.com",
    "https://registry.docker-cn.com",
    "http://hub-mirror.c.163.com",
    "http://mirrors.ustc.edu.cn/",
    "https://mirrors.tuna.tsinghua.edu.cn/",
    "http://mirrors.sohu.com/"
  ],
  "insecure-registries": [
    "registry.docker-cn.com",
    "docker.mirrors.ustc.edu.cn"
  ],
  "debug": true,
  "experimental": false
}
EOF

重新加载配置

python 复制代码
systemctl daemon-reload

重启docker

python 复制代码
systemctl restart docker

查看配置是否生效

python 复制代码
docker info

部分信息如下所示:

可以看到我此处的镜像源已经切换成功。

将项目进行打包

接下来打包镜像:

python 复制代码
sudo docker build -t yolo-ui-app .

如果不成功,就换网络试试,切换镜像。

我这里打包成功了!!下面有一些权限问题,参考这篇文章:采用docker部署含有qt界面的Python项目教程_docker pyqt

停止x11访问限制,只允许本地连接,每次开机都要使用此命令

python 复制代码
xhost +local:root

检查DISPLAY变量

python 复制代码
echo $DISPLAY

这里会显示 :0

测试X11是否正常工作

python 复制代码
xeyes

获取X11认证信息

python 复制代码
xauth list $DISPLAY

中间出现了一个错误,问题在我的requirements.txt文件里面:

基础包(使用清华镜像)

-i https://pypi.tuna.tsinghua.edu.cn/simple/

torch>=1.8.0

numpy==1.21.6

PyQt5==5.15.10

PyYAML==6.0.1

opencv-python>=4.5.0

Pillow>=9.0.0

matplotlib>=3.5.0

seaborn>=0.11.0

ultralytics==8.0.145

onnx>=1.12.0

好像是我的Dockfile里面有了,然后这里好像还与版本有关系,但是注释掉就没问题了。

运行容器

python 复制代码
docker run --rm -it \
  --name yolo-ui-app-container \
  -e DISPLAY=$DISPLAY \
  -v /tmp/.X11-unix:/tmp/.X11-unix \
  -v $HOME/.Xauthority:/root/.Xauthority:ro \
  --network host \
  yolo-ui-app

正常显示出来了

总结

目前装的仅是cpu版本,对于gpu版本会发生超时和存储不够的问题,关于这一部分后面再找时间研究一下。

相关推荐
SelectDB7 小时前
Litefuse 开源并推出单进程轻量模式,25 秒就能跑起来的 Agent 可观测与评估平台
运维·后端·自动化运维
曲幽14 小时前
别再用网页翻译看源码了!你的私人翻译神器LibreTranslate,部署避坑指南来了
python·docker·web·pot·translate·libretranslate·arogstranslate
XIAOHEZIcode2 天前
Linux系统鼠标偏移常见原因以及修复方案
linux·运维·游戏
用户0328472220702 天前
如何搭建本地yum源(上)
运维
武子康2 天前
调查研究-183 Apple container:Mac 上用轻量 VM 跑 Linux 容器,Swift 会改写本地容器体验吗?
docker·容器·apple
大树885 天前
金刚石散热越强,管路越先见顶
大数据·运维·服务器·人工智能·ai
摇滚侠5 天前
Linux CentOS7 rpm 安装 MySQL 5.7
linux·运维·mysql
霸道流氓气质5 天前
领域驱动设计(DDD)在 Spring Boot 微服务中的实践指南
运维·spring boot·微服务
Inhand陈工5 天前
基于台达PLC与映翰通IG502的智慧水产养殖精准投喂与远程运维解决方案
运维·人工智能·物联网·阿里云·信息与通信
Alsn865 天前
等待学习-学习目录:Docker 容器安全攻防
学习·安全·docker