在使用 noVNC 和 pyautogui 的 Dockerized FastAPI 中看不到光标移动

问题描述 投票:0回答:1

我正在设置一个 Docker 容器来托管 FastAPI 应用程序,该应用程序通过 noVNC 与虚拟显示器交互,使用 pyautogui 控制鼠标光标。容器成功运行,我可以访问 FastAPI 文档并使用 API 来移动并单击鼠标光标。但是,当我通过 noVNC 连接到虚拟显示器时,即使 API 响应成功消息,我也看不到光标移动。

我的 Dockerfile:

# Use an official Ubuntu base image
FROM ubuntu:20.04

# Avoid warnings by switching to noninteractive
ENV DEBIAN_FRONTEND=noninteractive
ENV DISPLAY=:1.0

# Install Ubuntu desktop, VNC server, and noVNC
RUN apt-get update && apt-get install -y \
    xfce4 \
    xfce4-goodies \
    tightvncserver \
    novnc \
    net-tools \
    python3-pip \
    python3-tk \      
    python3-dev \   
    && rm -rf /var/lib/apt/lists/*

# Setup VNC Server
RUN mkdir /root/.vnc
# Set your VNC password here (it should be changed)
RUN echo "your_vnc_password" | vncpasswd -f > /root/.vnc/passwd
RUN chmod 600 /root/.vnc/passwd

# Install Python packages
RUN pip3 install fastapi uvicorn pyautogui

# Copy your FastAPI application to the container
COPY ./app /app

# Expose VNC server port and FastAPI port
EXPOSE 5901 8000

# Set the USER environment variable
ENV USER=root
RUN touch /root/.Xauthority


# Set up the VNC server and noVNC
CMD ["sh", "-c", "vncserver :1 -geometry 1280x800 -depth 24 && websockify -D --web=/usr/share/novnc/ 8080 localhost:5901 && cd /app && uvicorn app:app --host 0.0.0.0 --port 8000"]

我的app.py文件:

from fastapi import FastAPI, HTTPException
from pydantic import BaseModel
import pyautogui
import uvicorn

# Define a Pydantic model for the incoming data


class Coordinates(BaseModel):
    x: int
    y: int


app = FastAPI()


@app.post("/move_click/")
async def move_click(coords: Coordinates):
    try:
        # Move the cursor to the specified coordinates
        pyautogui.moveTo(coords.x, coords.y, duration=1)
        # Click at the current position
        pyautogui.click()
        return {"message": f"Cursor moved and clicked at ({coords.x}, {coords.y})"}
    except Exception as e:
        raise HTTPException(status_code=400, detail=str(e))

if __name__ == "__main__":
    uvicorn.run(app, host="0.0.0.0", port=8000)

我已验证容器正在运行并且 FastAPI 应用程序可访问。当我导航到 http://localhost:8080/vnc.html 上的 noVNC 界面时,我看到一个空白屏幕(正如预期,没有打开任何应用程序),但与 FastAPI 端点交互以移动光标并不会在视觉上改变任何内容在 noVNC 显示屏上。

  • Docker 或 noVNC 中是否有我应该检查以诊断问题的日志或工具?
  • 在此上下文中使用时,这可能是 pyautogui 或 noVNC 的限制或配置问题吗?
  • 我可以采取哪些步骤来调试或解决此问题,以便光标移动在 noVNC 显示中可见?
docker fastapi pyautogui xfce novnc
1个回答
0
投票

你有:

[Docker Container]
│
├─ [Ubuntu 20.04]
│  ├─ [Xfce Desktop]
│  ├─ [TightVNC Server]───────[noVNC]─────> (Access via http://localhost:8080/vnc.html)
│  └─ [FastAPI + pyautogui]
│     └─ API Endpoint (/move_click/) ──> (Supposed to control mouse cursor)
│
└─ [Ports Exposed] ──> 5901 (VNC), 8000 (FastAPI)

Docker 或 noVNC 中是否有我应该检查以诊断问题的日志或工具?

当然,首先尝试

docker logs <container_id>
,然后
<container_id>
加上正在运行的容器的 ID。该命令将向您显示容器的 stdout 和 stderr 输出,其中可能包括来自应用程序、VNC 服务器或 noVNC 的错误或警告。

VNC 服务器通常记录连接、错误和其他重要事件。对于您根据 Dockerfile 使用的 TightVNC,可以在运行 VNC 服务器的用户的主目录中的

.vnc/*.log
下找到日志。由于您使用的是 root:
/root/.vnc/*.log
.

检查这些日志是否有任何异常,尤其是与显示问题、身份验证问题或连接错误相关的消息。

pyautogui 与主显示屏交互。在 Docker 容器设置中,主显示器通常是虚拟帧缓冲区。确保 pyautogui 确实控制着 noVNC 正在广播的显示。

noVNC 可能并不总是显式显示光标移动,除非 VNC 会话中的应用程序更新屏幕上的光标位置。尝试在 VNC 会话中打开文本编辑器或终端等应用程序,看看当有 GUI 元素与之交互时,pyautogui 的动作是否会反映出来。

确保 VNC 服务器正确配置为使用虚拟显示器。这可能涉及检查

.vnc/xstartup
脚本以确保它启动 pyautogui 可以与之交互的 X 会话。 Dockerfile 中的
DISPLAY
环境变量设置为
:1.0
。验证这是否与 VNC 服务器使用的显示器以及 pyautogui 应该与之交互的显示器相匹配。

尝试使用 Python shell 直接从容器内与 pyautogui 交互。这可以帮助确认 pyautogui 是否可以在容器环境中按预期控制光标。


当我导航到 http://localhost:8080/vnc.html 的 noVNC 界面时,我看到一个空白屏幕。

打开开发者工具执行此操作,查看控制台中是否有任何错误消息,或检查“空白”页面的内容。

© www.soinside.com 2019 - 2024. All rights reserved.