X11 显示变量未设置 - 无法运行 Docker Image

Posted

技术标签:

【中文标题】X11 显示变量未设置 - 无法运行 Docker Image【英文标题】:X11 Display variable is not set - can't run Docker Image 【发布时间】:2019-07-23 09:12:16 【问题描述】:

我制作了 JMeter 的 Docker-Image,因为我想远程运行它(并且从云中)。如果我运行图像,我会收到错误消息:“未设置 X11 DISPLAY 变量,但该程序执行了需要它的操作。”

我已经更新了 ssh_config 文件和 sshd_config 文件(如在类似问题中所述),但仍然无法正常工作。

我的 DISPLAY 变量设置为localhost:10.0。知道我在 Ubuntu 19.04 上的 VM 上执行此操作可能很有用。

感谢您的帮助。

【问题讨论】:

见***.com/questions/662421/… 是的,就像我说的。它仍然不起作用。我尝试了这些解决方案,但没有解决我的问题。 【参考方案1】:

经过几个小时的搜索,我找到了解决方案:(credit) 我的设置是 ubuntu 18.04,lxde,这个docker build 我修改了这样的运行脚本:

#!/bin/bash
#
# Run JMeter Docker image with options

NAME="jmeter"
JMETER_VERSION=$JMETER_VERSION:-"5.4"
IMAGE="justb4/jmeter:$JMETER_VERSION"

# Finally run
xhost +
docker run -e DISPLAY=$DISPLAY  --rm --name $NAME -i -v $PWD:$PWD -v /tmp/.X11-unix:/tmp/.X11-unix:ro  -w $PWD $IMAGE $@
xhost -

这项工作,就努力而言,它比另一种方法(vnc...)要少得多

【讨论】:

【参考方案2】:

您应该使用ENV command 声明这个DISPLAY 变量,例如:

ENV DISPLAY :10

但请注意,您需要有一个显示服务器,至少是Xvfb。

所以在 Docker 容器中运行 JMeter GUI 是可能的,但是你必须把它当作一个普通的 Linux 桌面,它可以是像 Xfce 这样的最小桌面

示例Dockerfile 下载最新的JMeter,安装虚拟桌面并通过VNC 和RDP 使其可用

FROM alpine:edge

ENV DISPLAY :99
ENV RESOLUTION 1366x768x24

RUN  echo "http://dl-cdn.alpinelinux.org/alpine/edge/testing" >> /etc/apk/repositories \
    && apk add --no-cache curl xfce4-terminal xvfb x11vnc xfce4 openjdk8-jre bash xrdp \
    && curl -L https://archive.apache.org/dist/jmeter/binaries/apache-jmeter-5.1.1.tgz >  /tmp/jmeter.tgz \
    && tar -xvf /tmp/jmeter.tgz -C /opt \
    && rm /tmp/jmeter.tgz \
    && curl -L https://jmeter-plugins.org/get/ > /opt/apache-jmeter-5.1.1/lib/ext/jmeter-plugins-manager.jar \
    && echo "[Globals]" > /etc/xrdp/xrdp.ini \
    && echo "bitmap_cache=true" >> /etc/xrdp/xrdp.ini \
    && echo "bitmap_compression=true" >> /etc/xrdp/xrdp.ini \
    && echo "autorun=jmeter" >> /etc/xrdp/xrdp.ini \
    && echo "[jmeter]" >> /etc/xrdp/xrdp.ini \
    && echo "name=jmeter" >> /etc/xrdp/xrdp.ini \
    && echo "lib=libvnc.so" >> /etc/xrdp/xrdp.ini \
    && echo "ip=localhost" >> /etc/xrdp/xrdp.ini \
    && echo "port=5900" >> /etc/xrdp/xrdp.ini \
    && echo "username=jmeter" >> /etc/xrdp/xrdp.ini \
    && echo "password=" >> /etc/xrdp/xrdp.ini

EXPOSE 5900
EXPOSE 3389

CMD ["bash", "-c", "rm -f /tmp/.X99-lock && rm -f /var/run/xrdp.pid\
 && nohup bash -c \"/usr/bin/Xvfb :99 -screen 0 $RESOLUTION -ac +extension GLX +render -noreset && export DISPLAY=99 > /dev/null 2>&1 &\"\
  && nohup bash -c \"startxfce4 > /dev/null 2>&1 &\"\
   && nohup bash -c \"x11vnc -xkb -noxrecord -noxfixes -noxdamage -display :99 -forever -bg -nopw -rfbport 5900 > /dev/null 2>&1\"\
    && nohup bash -c \"xrdp > /dev/null 2>&1\"\
     && nohup bash -c \"/opt/apache-jmeter-5.1.1/bin/./jmeter -Jjmeter.laf=CrossPlatform > /dev/null 2>&1 &\"\
       && tail -f /dev/null"]

你可以build点赞:

docker build -t jmeter.

一旦完成,使用Docker run 命令启动容器,例如:

docker run -p 5900:5900 -p 3389:3389 jmeter

您可能还会发现Make Use of Docker with JMeter - Learn How 指南很有用。

【讨论】:

【参考方案3】:

Docker-Images 没有解决方案。因为 Docker 不支持 GUI,因此我收到此错误。因此,如果您使用 Docker 并遇到此错误,请忽略它或将您的图像更新为仅非 gui。

干杯

【讨论】:

以上是关于X11 显示变量未设置 - 无法运行 Docker Image的主要内容,如果未能解决你的问题,请参考以下文章

在 Windows 上使用 x11 转发在 docker 内运行 Omnet++。 SSH 不工作

使用 X11 在 docker 内运行 GUI 应用程序不起作用

Docker Compose File无法获取.env变量

sh 使用Docker显示X11窗口

无法在 Docker 容器中为 X11 自动启动没有 $DISPLAY 的 dbus-daemon

当图像在 docker 机器中运行时,X11 转发不起作用,但如果图像在没有 docker 机器的情况下运行,则它可以正常工作