web-dev-qa-db-fra.com

Transfert X11 de l'application graphique dans le conteneur Docker

J'essaie actuellement d'exécuter des applications graphiques dans des conteneurs Docker. J'ai essayé ceux de jessie frazelle at github . Cependant, je peux construire les images (ou obtenir à partir du concentrateur de docker) et les exécuter sans erreur visible, mais les fenêtres ne s'affichent pas (je ne peux pas voir l'application).

J'utilise Docker version 1.13.1 sur Ubuntu 16.04

L'image est créée à partir de:

FROM debian:stretch
MAINTAINER Jessie Frazelle <[email protected]>

RUN apt-get update && apt-get install -y \
    libreoffice \
    --no-install-recommends \
    && rm -rf /var/lib/apt/lists/*

ENTRYPOINT [ "libreoffice" ]

la commande d'exécution que j'utilise est ci-dessous:

docker run -d \
    -v /tmp/.X11-unix:/tmp/.X11-unix \
    -v /etc/localtime:/etc/localtime \
    -e DISPLAY=unix$DISPLAY 
    -v $HOME/Documents:/root/Documents \
    -e GDK_SCALE \
    -e GDK_DPI_SCALE \
    --name libreoffice \
    jess/libreoffice

Après avoir recherché de nombreuses sources, je peux voir que ce qui précède devrait fonctionner, et la plupart des gens disent que les lignes suivantes sont requises dans la commande d'exécution,

    -v /tmp/.X11-unix:/tmp/.X11-unix
    -e DISPLAY=unix$DISPLAY

mais je n'arrive toujours pas à afficher la fenêtre. 

  1. Comment puis-je le faire fonctionner?
  2. Qu'est-ce qui me manque fondamentalement?

Toute aide serait appréciée.

7
David Brough

Pour pouvoir communiquer avec le serveur X, l'utilisateur auquel vous exécutez l'application doit être autorisé à communiquer avec le serveur X. Donc, je pense que vous avez deux options:

1) Autorisez l’utilisateur que vous avez dans le conteneur à se connecter au serveur X. Si votre application est exécutée avec l'utilisateur root à l'intérieur du conteneur, vous pouvez utiliser:

$ xhost +SI:localuser:root

(Je ne connais pas les implications de ceci sur la sécurité, mais root devrait pouvoir se connecter de toute façon ...)

2) Ajoutez un utilisateur dans le conteneur correspondant à votre session utilisateur. Si l'utilisateur que vous utilisez dans le système hôte a UID = 1000, vous pouvez créer un utilisateur factice dans le conteneur:

$ useradd -u 1000 my_user

Et utilisez ensuite cet utilisateur pour exécuter votre application à l'intérieur du conteneur. Cela ne nécessite aucune modification des hôtes concernés (l'utilisateur 1000 étant déjà capable de se connecter).

En regardant les deux options, la seconde semble meilleure, car elle ne nécessite aucune modification du système hôte, et si vous devez utiliser ce conteneur dans d'autres systèmes pour lesquels l'utilisateur principal ne puisse pas correspondre à UID = 1000, vous pouvez créer le conteneur. recevez le bon uid d'une variable env, puis configurez le bon utilisateur (fichiers de programme useradd + chown).

1
Salem