我正在设置一个 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 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 界面时,我看到一个空白屏幕。
打开开发者工具执行此操作,查看控制台中是否有任何错误消息,或检查“空白”页面的内容。