X11 Erro ao executar como um contêiner do Docker

0

Estou tentando executar um aplicativo a partir de um contêiner do Docker que deve abrir uma janela gráfica (um fluxo de vídeo no meu caso). O contêiner do Docker é executado em um Raspberry Pi e I SSH no Pi do meu Mac e, em seguida, emita o comando de execução do Docker. Eu tenho um problema aqui:

Quando executo a coisa toda da seguinte maneira, ela funciona perfeitamente:

Eu corro o comando como:

docker run -it --net=host --device=/dev/vcsm --device=/dev/vchiq -e DISPLAY -v /tmp/.X11-unix joesan/motion_detector bash

No bash, que é aberto após a emissão do comando de execução do Docker, eu instalo o xauth

root@cctv:/raspi_motion_detection/project# apt-get install xauth

Em seguida, adiciono o cookie Xauth usando o Xauth add e, em seguida, executo meu programa Python, que mostra a janela da GUI com o fluxo de vídeo!

Até aí tudo bem. Mas, toda vez que eu não quero mais repetir esses passos. Então eu escrevi um pequeno script para fazer isso abaixo:

HOST=cctv

DISPLAY_NUMBER=$(echo $DISPLAY | cut -d. -f1 | cut -d: -f2)
echo $DISPLAY_NUMBER

# Extract auth cookie
AUTH_COOKIE=$(xauth list | grep "^$(hostname)/unix:${DISPLAY_NUMBER} " | awk '{print $3}')

# Add the xauth cookie to xauth
xauth add ${HOST}/unix:${DISPLAY_NUMBER} MIT-MAGIC-COOKIE-1 ${AUTH_COOKIE}

# Launch the container  
docker run -it --net=host --device=/dev/vcsm --device=/dev/vchiq -e DISPLAY -v /tmp/.X11-unix  joesan/motion_detector'

Mas desta vez falha com o erro:

X11 connection rejected because of wrong authentication.
Unable to init server: Could not connect: Connection refused

Eu então tentei executar o script acima como um usuário sudo e obtive o seguinte:

xauth:  file /root/.Xauthority does not exist
xauth: (argv):1:  bad "add" command line
X11 connection rejected because of wrong authentication.
Unable to init server: Could not connect: Connection refused

Existe alguma coisa que me falta?

    
por sparkr 13.11.2018 / 18:27

1 resposta

2

O comando apt-get install xauth deve ser requerido apenas uma vez, e assim você pode incluí-lo em seu Dockerfile para que ele seja executado quando você construir sua imagem.

RUN apt-get install xauth

Para o comando xauth add , você parece estar dependendo da variável DISPLAY, que é passada para o contêiner na inicialização. Nesse caso, seria melhor criar um script de shell que faça toda a inicialização necessária na inicialização e, em seguida, inicie seu programa em Python. Por exemplo:

#!/bin/bash

HOST=cctv
DISPLAY_NUMBER=$(echo $DISPLAY | cut -d. -f1 | cut -d: -f2)
AUTH_COOKIE=$(xauth list | grep "^$(hostname)/unix:${DISPLAY_NUMBER} " | awk '{print $3}')
xauth add ${HOST}/unix:${DISPLAY_NUMBER} MIT-MAGIC-COOKIE-1 ${AUTH_COOKIE}
python /path/to/program.py

Depois, você pode copiar este script durante a fase de construção e configurá-lo como seu comando ou ponto de entrada.

COPY init-script.bash /opt/program
CMD ["/bin/bash","/opt/program/init-script.bash"]
    
por 14.11.2018 / 10:11

Tags