当前位置: 首页 > 面试题库 >

带有GUI应用程序的Docker

巫马修然
2023-03-14
问题内容

我需要从Docker容器中在后台运行的Java应用程序中启动Selenium。启动失败,因为在运行时无法访问X11环境。请参阅Dockerfile下面的内容。

我该怎么办?

问题

我从Dockerfile安装Java 8和Jetty 9.3.x
的简单程序开始运行一个简单的服务(实际上是selenium的东西)。该服务实际上是为了启动一些需要UI才能执行的事情而设置的。我遇到的问题是其中的任何内容执行失败,因为UI在我运行的配置中不可用。我还有其他一些要运行的东西supervisord,但这是基本设置:

Docker文件

FROM ubuntu:16.04

RUN apt-get update -y && \
    apt-get install -y software-properties-common wget supervisor && \
    mkdir -p /var/log/supervisor && \
    mkdir -p /etc/supervisor/conf.d

RUN useradd -Ums /bin/bash jetty

RUN echo oracle-java8-installer shared/accepted-oracle-license-v1-1 select true | debconf-set-selections && \
  add-apt-repository -y ppa:webupd8team/java && \
  apt-get update && \
  apt-get install -y oracle-java8-installer && \
  rm -rf /var/lib/apt/lists/* && \
  rm -rf /var/cache/oracle-jdk8-installer

ENV JAVA_HOME /usr/lib/jvm/java-8-oracle

ENV JETTY_VERSION "9.3.7.v20160115"
ENV JETTY_HOME "/opt/jetty"

RUN wget -q -O /opt/jetty.tgz "http://download.eclipse.org/jetty/${JETTY_VERSION}/dist/jetty-distribution-${JETTY_VERSION}.tar.gz" && \
    cd /opt && \
    tar -zxvf /opt/jetty.tgz && \
    rm /opt/jetty.tgz && \
    mv "/opt/jetty-distribution-${JETTY_VERSION}" "${JETTY_HOME}" && \
    chown -R jetty:jetty "${JETTY_HOME}"

ADD supervisor.conf /etc/supervisor.conf
ADD jetty.sv.conf /etc/supervisor/conf.d/jetty.sv.conf

CMD ["supervisord", "-c", "/etc/supervisor.conf"]

码头

[program:jetty]
command=/usr/bin/java -jar /opt/jetty/start.jar jetty.home=/opt/jetty jetty.base=/opt/jetty
redirec_stderr=true
startsecs=5

我想确保所有内容都在UI环境中运行,而不是在无头环境中运行。

我尝试过的

我尝试使用VNC和共享桌面设置,如下所示:

  • 您可以在Docker容器中运行GUI应用吗?
  • https://github.com/dockerfile/ubuntu-desktop
  • https://github.com/fcwu/docker-ubuntu-vnc-desktop
  • https://hub.docker.com/r/dorowu/ubuntu-desktop-lxde-vnc/
  • https://blog.docker.com/2013/07/docker-desktop-your-desktop-over-ssh-running-inside-of-a-docker-container/
  • 构建完整的Ubuntu桌面Docker映像
  • http://fabiorehm.com/blog/2014/09/11/running-gui-apps-with-docker/

但是,这仍然不允许我的Java应用程序执行GUI应用程序。和往常一样,我确定这里缺少一些简单的东西。

如何执行具有访问UI权限的Jetty容器?


问题答案:

我们有几乎相同的情况。Bamboo是CI /
CD工具,selenium和java8是用于回归测试的工具,所有这些工具都在docker容器中运行。所以我可以说这是100%可能的。

可能可以帮助您的是xvbf(无头X服务器)和x11vnc(vnc服务器以查看容器内部实际发生的情况)

RUN set -x &&\
    apt-get update &&\
    apt-get install -y xvfb x11vnc &&\
    apt-get clean autoremove &&\
    mkdir ~/.vnc/ && x11vnc -storepasswd 111222 ~/.vnc/passwd &&\
    echo "export DISPLAY=:0" >> ~/.bashrc

如果需要,还可以安装firefox

RUN     set -x\
        && curl -O https://ftp.mozilla.org/pub/firefox/releases/47.0.1/linux-x86_64/ru/firefox-47.0.1.tar.bz2\
        && tar xvjf firefox-47.0.1.tar.bz2 -C /usr/local/src\
        && rm -rf firefox-47.0.1.tar.bz2\
    && ln -s /usr/local/src/firefox/firefox /usr/local/bin/firefox

还将此命令添加到启动向导或入口点脚本

source ~/perl5/perlbrew/etc/bashrc
rm -f /tmp/.X10-lock
Xvfb :0 -screen 0 1600x1200x24 &
firefox -height 1200 -width 1600 &
x11vnc -usepw -forever -shared &

启动容器后的结果是,您将能够通过任何vnc客户端连接到该容器,并查看firefox欢迎页面,或者在运行webtest的情况下进行测试。



 类似资料:
  • 在上一章中,我们创建了一个示例RMI应用程序。 在本章中,我们将解释如何创建RMI应用程序,其中客户端调用显示GUI窗口(JavaFX)的方法。 定义远程接口 在这里,我们使用名为animation()的方法定义一个名为Hello的远程接口。 import java.rmi.Remote; import java.rmi.RemoteException; // Creating Remote

  • 我正在尝试使用python3构建带有GUI的youtube下载程序。在学习了python的基础知识之后,我正在尝试构建一个。我正在使用“pafy”和“TKinter”模块。 以下是GUI 1中涉及的小部件。一个输入字段,用于输入URL 2。在它旁边粘贴按钮3。媒体选择下拉菜单4。另一个下拉菜单列出介质质量(取决于以前的介质输入)5。最后是下载按钮 这是我的密码 我被“下载功能”卡住了。我是否正确使

  • 我正在尝试开发一个应用程序,它应该能够运行在只有CLI的环境中,以及在启用GUI的模式下。由于我的一些工作是由Jav FX线程完成的,所以我需要在不启动图形引擎的情况下启动JavaFX主线程,因为这在只使用CLI的环境中会崩溃。我该怎么做?我已经编写了第一个主类,它将使用命令行参数来决定GUI是否将被启动或者它应该在CLI模式下运行。GUI已经工作了,我只需要弄清楚如何在另一个类中运行没有GUI的

  • 问题内容: 如何为手机创建J2ME应用程序,其GUI与您在Java游戏中看到的菜单类似?我已经尝试过使用Netbeans的MIDlet,但是它们一次只显示一个GUI元素。 (文本框,选择项,登录名等) 您通常在哪个Java IDE中设计这些GUI?Netbeans还是Eclipse?IntelliJ IDEA也可用于此吗? 我是否必须编写/获取一个库,该库通过位图函数将GUI控件绘制到屏幕上,并保

  • 问题内容: 我尝试在具有/tmp/.X11-unix装载的容器docker中运行一些Qt应用程序。我在这里看到 这可能很困难。 因此,当我在容器docker中运行kdevelop时,它不起作用(我有一个空窗口)。但是如果我运行qtcreator很好。 我认为差异来自Qt版本(kdevelop在Qt4和qtcreator在Qt5中开发)。我所有其他的qt5应用程序都可以正常工作,但在qt4中却没有一

  • 问题内容: 我正在看在docker 中运行GUI应用程序。我听说由于Xserver被暴露,这会引起安全问题。我想知道以下每个步骤的操作,特别是: [-d〜/ workspace] || mkdir〜/工作区 xhost local:root docker run -i –net = host –rm -e DISPLAY -v $ HOME / workspace /:/ workspace /: