这几天在Docker容器上安装qt5时各种碰壁,留个记录方便回看。
编写Dockerfile脚本
FROM yutianchi/11.2.1-cudnn8-runtime-ubuntu18.04-conda:1.0.0
USER root
RUN sed -i s@/archive.ubuntu.com/@/mirrors.aliyun.com/@g /etc/apt/sources.list
RUN apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 'A4B469963BF863CC'
RUN apt-get update
ENV TIME_ZONE Asia/Shanghai
ENV DEBIAN_FRONTEND=noninteractive
ENV LIBGL_ALWAYS_INDIRECT=1
RUN apt-get install ffmpeg -y
RUN apt-get install libgl1-mesa-glx -y
RUN apt-get install libxss1 -y
RUN apt-get install libappindicator1 -y
RUN apt-get install libindicator7 -y
RUN apt-get install libjpeg8-dev -y
RUN apt-get install libpng-dev -y
RUN apt-get install libtiff5-dev -y
RUN apt-get install zlib1g-dev -y
RUN apt-get install libleptonica-dev -y
RUN apt-get install libtesseract-dev -y
RUN apt-get install tesseract-ocr -y
RUN apt-get install fonts-liberation -y
RUN apt-get install libappindicator3-1 -y
RUN apt-get install libasound2 -y
RUN apt-get install libnspr4 -y
RUN apt-get install libnss3 -y
RUN apt-get install xdg-utils -y
RUN apt-get install libcanberra-gtk-module -y
RUN apt-get install tcl-dev -y
RUN apt-get install tk-dev -y
RUN apt-get install python3-tk -y
RUN apt-get install dbus -y
RUN apt-get install locales -y
RUN apt-get install ttf-wqy-microhei -y
RUN apt-get install language-pack-zh-hans -y
RUN apt-get install python3-pyqt5 -y
构建qt5:1.0镜像
#注意最后有个‘.’不能丢了
sudo docker build -t qt5:1.0 .
赋予权限
#如果授予成功的话则会显示“non-network local connections being added to access control list”
xhost local:root
创建容器
sudo docker run -itd --net=host --name qt5_test --gpus all --privileged -v /mnt:/mnt -e DISPLAY=$DISPLAY -u root qt5:1.0
进入容器
sudo docker exec -it qt5_test bash
进入容器之后应该会自动启动conda的base环境,接下来创建自己的conda环境,再安装qt5依赖就行了
创建conda环境并安装qt5依赖
#创建环境
conda create -n qt5 python=3.8
#启动环境
conda activate qt5
#安装qt5依赖
pip install Qt5
测试qt5能否正常使用
在宿主机的mnt目录(创建容器映射的目录)下创建App.py文件,编写以下内容。
import sys
from PyQt5.QtWidgets import QApplication, QWidget, QLabel, QPushButton, QVBoxLayout
class MyWindow(QWidget):
def __init__(self):
super().__init__()
self.initUI()
def initUI(self):
# 创建标签
label = QLabel('PyQt5界面', self)
label.move(50, 50)
# 创建按钮
button = QPushButton('点击', self)
button.move(50, 100)
button.clicked.connect(self.buttonClicked)
# 创建布局
vbox = QVBoxLayout()
vbox.addWidget(label)
vbox.addWidget(button)
# 将布局应用到窗口
self.setLayout(vbox)
# 设置窗口大小和标题
self.setGeometry(300, 300, 300, 200)
self.setWindowTitle('PyQt5界面')
self.show()
def buttonClicked(self):
# 按钮点击事件
print('按钮被点击')
if __name__ == '__main__':
app = QApplication(sys.argv)
window = MyWindow()
sys.exit(app.exec_())
测试
cd /mnt
python App.py
若是执行成功的话则会显示如下界面
参考文章
https://blog.csdn.net/weixin_39289876/article/details/129687980