2017-08-23 6 views
0

Mon intention est d'exécuter un fichier JAR GUI dans Docker afin que je puisse automatiser les commandes avec xdotool et l'afficher par x11vnc.La commande RUN ne semble pas fonctionner dans Docker

Ceci est mon 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"] 

je lance avec:

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

Mais dans ce conteneur, il est pas défini $ DISPLAY et ne fonctionne pas x11vnc et Xvfb

[email protected]:/# echo $DISPLAY 

[email protected]:/# 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 
[email protected]:/# 

(Si j'exécute ces commandes en RUN dans bash, ça marche ... je ne sais pas pourquoi RUN ne semble pas fonctionner il construit docker)

Répondre

1

docker utilise un système de fichiers de la couche lorsque vous RUN il créer une couche séparée pour l'installation, il est PAS utiliser pour exécuter un programme, mais il est utilisé pour télécharger le code source ou de construire à partir le code source, etc., par exemple RUN mvn package

La façon dont vous devriez faire est de créer un script shell couramment qu'ils appellent vous bootstrap.sh copier que dans votre contenant COPY bootstrap.sh /app ou quelque chose comme ça, alors vous pouvez mettre dans cette commande

#!/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 

dans votre script shell et la dernière commande dans votre dockerfile changer pour CMD ./bootstrap.sh quelque chose comme ça

+0

Ainsi, le processus exécuté dans une couche ne s'exécute pas dans des couches enfant? Seul le système de fichiers est hérité? –

+0

oui pour la commande run créer un autre conteneur (couche alias) que l'autre conteneur pourrait utiliser aussi par exemple la couche ubuntu 14 pourrait être utilisée par plusieurs conteneurs mais la dernière couche qui est créée est celle qui est exécutée pour rester en vie (si vous docker l'exécuter en mode détaché) – Hamuel

0

ajouter à votre docker run

commande

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

et si vous avez besoin d'exportation, le

ENV

directive

est la conception ed pour cela, voir

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

+0

Il exécuterait l'interface graphique toujours dans mon hôte, est-ce pas? Ce n'est pas exactement ce que je veux. Je veux lancer le pot dans le conteneur et visualiser juste si nécessaire. C'est pourquoi j'ai installé x11vnc. –