Doglight 2024-08-02 16:19 采纳率: 0%
浏览 48

WSL下docker容器内执行qt程序问题

在wsl2下运行docker容器,希望能显示出qt程序界面,但运行遇到以下报错:
QStandardPaths: runtime directory '/mnt/wslg/runtime-dir' is not owned by UID 0, but a directory permissions 0700 owned by UID 1000 GID 1000

这是我的docker 运行指令:

#!/usr/bin/env bash

MONITOR_HOME_DIR="$( cd "$( dirname "$0" )/.." && pwd )"
echo MONITOR_HOME_DIR: $MONITOR_HOME_DIR

display=""
if [ -z ${DISPLAY} ];then
    display=":1"
else
    display="${DISPLAY}"
fi

user="${USER}"
uid="$(id -u)"
group="$(id -g -n)"
gid="$(id -g)"

echo "create docker"
echo display: $display

docker run -it -d \
--name monitor_test \
--env=unix$DISPLAY \
--privileged=true \
--net host \
-v ${MONITOR_HOME_DIR}:/work \
-v /tmp/.X11-unix:/tmp/.X11-unix \
monitor

和进入docker指令:

#!/usr/bin/env bash

xhost +local:root 1>/dev/null 2>&1
docker exec \
-u root \
-it monitor \
/bin/bash
xhost -local:root 1>/dev/null 2>&1

  • 写回答

1条回答 默认 最新

  • 暖阳浅笑-嘿 2024-08-03 23:20
    关注

    在WSL2下运行Docker容器并显示Qt程序界面时,遇到的错误提示是由于目录权限问题。QStandardPaths: runtime directory '/mnt/wslg/runtime-dir' is not owned by UID 0, but a directory permissions 0700 owned by UID 1000 GID 1000 表明/mnt/wslg/runtime-dir目录的所有者不是UID 0(即root用户)。

    为了解决这个问题,可以尝试以下步骤:

    1. 确认并修正DISPLAY环境变量

    确保在Docker容器中设置正确的DISPLAY环境变量。在运行Docker容器时,使用以下命令将DISPLAY环境变量传递到容器中:

    docker run -it -d \
    --name monitor_test \
    --env=DISPLAY=${DISPLAY} \
    --privileged=true \
    --net host \
    -v ${MONITOR_HOME_DIR}:/work \
    -v /tmp/.X11-unix:/tmp/.X11-unix \
    monitor
    

    2. 确认xhost配置

    在宿主机上,使用xhost命令允许root用户访问X服务器:

    xhost +local:root
    

    3. 修正目录权限问题

    如果目录权限问题仍然存在,可以在Docker容器启动后修改相关目录的权限:

    #!/usr/bin/env bash
    xhost +local:root 1>/dev/null 2>&1
    docker exec \
    -u root \
    -it monitor_test \
    bash -c "chown -R root:root /mnt/wslg/runtime-dir && chmod 0700 /mnt/wslg/runtime-dir && /bin/bash"
    xhost -local:root 1>/dev/null 2>&1
    

    4. 使用环境变量解决目录权限问题

    可以尝试将环境变量XDG_RUNTIME_DIR设置为其他路径,例如:

    docker run -it -d \
    --name monitor_test \
    --env=DISPLAY=${DISPLAY} \
    --env=XDG_RUNTIME_DIR=/tmp \
    --privileged=true \
    --net host \
    -v ${MONITOR_HOME_DIR}:/work \
    -v /tmp/.X11-unix:/tmp/.X11-unix \
    monitor
    

    5. 确保Docker镜像中的Qt配置正确

    确保你的Docker镜像中包含了必要的Qt库,并且这些库已经正确配置以支持X11转发。你可以在Dockerfile中添加以下内容:

    RUN apt-get update && apt-get install -y \
        qt5-default \
        qtcreator \
        qtwayland5 \
        libx11-dev
    

    总结

    通过调整环境变量、修正目录权限、配置xhost和确保Docker镜像中的Qt配置正确,可以解决在WSL2下运行Docker容器时Qt程序界面显示的问题。如果这些步骤仍然无法解决问题,请提供更多的日志信息以便进一步排查。

    评论

报告相同问题?

问题事件

  • 创建了问题 8月2日