0

我的目的是在 Docker 中运行一个 GUI jar 文件,这样我就可以使用 xdotool 自动执行命令,并可以通过 x11vnc 查看它。

这是我的 Dockerfile:

# WEB 0.1

FROM ubuntu:14.04
RUN apt-get update \
 && apt-get install -y \
  default-jre \
  x11vnc \
  xdotool \
  xsel \
  xvfb \
 && apt-get clean \
 && rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/*

RUN DISPLAY=:1.0 \
 && export DISPLAY \
 && mkdir /root/.vnc \
 && x11vnc -storepasswd 1234 /root/.vnc/passwd \
 && Xvfb :1 -screen 0 493x476x8 & \
 x11vnc -display :1.0 -usepw -forever &

ENTRYPOINT ["java"]
CMD ["-jar", "/var/bin/program.jar"]

我运行它:

docker run \
  --name program-jar \
  -p 5090:5900 \
  -v /var/bin/program-jar/:/var/bin/ \
  -d program-jar:0.1

但是在这个容器内它没有定义 $DISPLAY 并且没有运行 x11vnc 和 Xvfb

root@62febbc0b8f9:/# echo $DISPLAY

root@62febbc0b8f9:/# ps aux
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root         1 11.7  0.9 4226956 98588 ?       Ssl  14:30   0:01 java -jar /var/bin/program.jar
root        26  0.2  0.0  18188  3268 ?        Ss   14:30   0:00 /bin/bash
root        41  0.0  0.0  15580  2044 ?        R+   14:30   0:00 ps aux
root@62febbc0b8f9:/# 

(如果我在 RUN 中运行这些命令,它可以工作......不知道为什么 RUN 在运行 docker build 时似乎不起作用)

4

2 回答 2

1

docker 在您为安装创建单独的层时使用层文件系统,RUN它不用于运行程序,但用于下载源代码或从源代码构建等。例如RUN mvn package

你应该这样做的方法是创建一个 shell 脚本,他们通常称之为 bootstrap.sh 你将它复制到你的容器COPY bootstrap.sh /app或类似的东西中,然后你可以放入这个命令

#!/bin/bash

DISPLAY=:1.0 \
 && export DISPLAY \
 && mkdir /root/.vnc \
 && x11vnc -storepasswd 1234 /root/.vnc/passwd \
 && Xvfb :1 -screen 0 493x476x8 & \
 x11vnc -display :1.0 -usepw -forever &

java -jar /var/bin/program.jar

进入你的shell脚本和你的dockerfile中的最后一个命令将它更改为类似的CMD ./bootstrap.sh东西

于 2017-08-23T14:46:11.723 回答
0

添加到您的docker run

命令

-v $HOME/.Xauthority:/home/developer/.Xauthority -v /tmp/.X11-unix:/tmp/.X11-unix:ro

如果你需要一些出口,

环境噪声

指示

专为此而设计,请参阅

https://docs.docker.com/engine/reference/builder/#env

于 2017-08-23T14:44:35.200 回答