如何编写 Dockerfile 来运行 Python3 + PyQt5

Posted

技术标签:

【中文标题】如何编写 Dockerfile 来运行 Python3 + PyQt5【英文标题】:How to Write a Dockerfile to run Python3 + PyQt5 【发布时间】:2020-03-31 17:01:25 【问题描述】:

故事是,我已经使用 Python3.8、PyQt5 和 Postgres 构建了一个小的 Python 软件,所以我正在尝试创建一个容器来对所有这些东西进行 dockerize,我正在考虑创建一个 Dockerfile 来创建一个容器对于 python + pqt5,另一个容器仅用于 Postgres,然后使用 docker-compose 链接所有内容。

问题是,当我尝试为 Python 和 PyQt5 创建容器时,我遇到了这个错误。

qt.qpa.plugin: Could not load the Qt platform plugin "xcb" in "" even though it was found.
This application failed to start because no Qt platform plugin could be initialized. Reinstalling the application may fix this problem.

Available platform plugins are: eglfs, linuxfb, minimal, minimalegl, offscreen, vnc, wayland-egl, wayland, wayland-xcomposite-egl, wayland-xcomposite-glx, webgl, xcb.

而这其实就是我说的Dockerfile

FROM python:3

COPY *.py /code/
COPY requirements.txt /code/

WORKDIR /code/

RUN apt-get update -y && apt-get upgrade -y && \
    apt-get install xvfb -y

RUN pip install --no-cache-dir -r requirements.txt

CMD ["python3", "main.py"]

这是我的 requirements.txt 的内容

psycopg2
requests
PyQt5

我尝试了在网络上找到的所有解决方案以及在 Docker Hub 上找到的其他解决方案,但都没有给我预期的结果。

任何好的灵魂都可以阐明这个问题吗? 最好有书面代码。

【问题讨论】:

很难在 Docker 容器外运行交互式 GUI 应用程序(并且需要在非 Linux 主机上使用非标准软件)。我建议改用普通的 Python 虚拟环境。 根据this article,有一个 apt repo 将使用 PyQt5 安装 python3。您需要从基本 ubuntudebian 图像而不是基本 python 图像开始 是的,在我的电脑上一切正常,所以最后一个挑战是让一切在 docker 上也能正常工作。一定有办法让它发挥作用。 【参考方案1】:

这并不难。 Qt 软件是交互式的吗?

    如果没有,那么您需要使用另一个“虚拟”平台插件。 xcb 插件仅用于 X 显示器。

    如果是,那么您有多种选择:

    一个。在桌面上运行 X 服务器。在容器中设置 DISPLAY env var,并将服务器的相关端口转发到容器中。 SHM 扩展将不可用,因此性能会比直接在桌面上运行应用程序要低一些。

    b.使用 Qt webgl 流技术运行 Web 浏览器客户端。 Qt 软件将作为容器中的服务器运行,并将其 GUI 提供给浏览器客户端。

    c。在桌面上直接(原生)运行 Qt 应用程序,并在容器中运行必要的服务。让应用程序与容器中的服务进行通信。您可以拥有一些公开 API 的中间件,也可以直接与数据库对话。这在一定程度上取决于您项目的需求,以及它最终的发展方向。

【讨论】:

以上是关于如何编写 Dockerfile 来运行 Python3 + PyQt5的主要内容,如果未能解决你的问题,请参考以下文章

如何编写一个可以启动服务并运行 shell 并接受 shell 参数的 Dockerfile?

如何安装和运行 wkhtmltopdf Docker 镜像

如何从 dockerfile 启动 Docker Compose 并一起运行 curl

9Dockerfile语法

如何编写最佳的Dockerfile

编写Dockerfile来构建nginx:latest镜像