运行命令似乎不能在Docker中工作

我的意图是在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:/# 

(如果我在bash中运行这些命令,它就会工作…不知道为什么运行docker版本时运行似乎不起作用)

docker在RUN时使用一个图层文件系统它为安装创build一个单独的层,它不是用来运行程序,而是用来下载源代码或者从源代码编译等,例如RUN mvn package

你应该这样做的方式是创build一个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

添加到你的docker run

命令

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

如果你需要一些出口,

ENV

指示

是为此而devise的,请参阅

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