GUI 창(제 경우에는 비디오 스트림)을 열어야 하는 Docker 컨테이너에서 애플리케이션을 실행하려고 합니다. Docker 컨테이너는 Raspberry Pi에서 실행되고 있으며 Mac에서 Pi에 SSH로 연결하고 Docker 실행 명령을 실행합니다. 여기에 질문이 있습니다.
다음과 같이 전체 프로세스를 실행하면 완벽하게 작동합니다.
다음과 같이 명령을 실행합니다.
docker run -it --net=host --device=/dev/vcsm --device=/dev/vchiq -e DISPLAY -v /tmp/.X11-unix joesan/motion_detector bash
Docker run 명령을 실행한 후 열린 bash에서 xauth를 설치합니다.
root@cctv:/raspi_motion_detection/project# apt-get install xauth
그런 다음 Xauth add를 사용하여 Xauth 쿠키를 추가한 다음 비디오 스트림과 함께 GUI 창을 표시하는 Python 프로그램을 실행합니다!
여태까지는 그런대로 잘됐다. 하지만 매번 이 단계를 다시 수행하고 싶지는 않습니다. 그래서 저는 이를 위해 다음과 같은 작은 스크립트를 작성했습니다.
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`
그러나 이번에는 다음 오류로 인해 실패합니다.
X11 connection rejected because of wrong authentication.
Unable to init server: Could not connect: Connection refused
그런 다음 위 스크립트를 sudo 사용자로 실행해 보았고 다음과 같은 결과를 얻었습니다.
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
내가 놓친 것이 있나요?
답변1
이 apt-get install xauth
명령은 한 번만 필요하므로 Dockerfile에 포함하여 이미지를 빌드할 때 실행할 수 있습니다.
RUN apt-get install xauth
해당 xauth add
명령의 경우 시작 시 컨테이너에 전달되는 DISPLAY 변수에 의존하는 것 같습니다. 이 경우 시작 시 필요한 모든 초기화를 수행한 다음 Python 프로그램을 시작하는 셸 스크립트를 만드는 것이 좋습니다. 예를 들어:
#!/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
그런 다음 빌드 단계에서 이 스크립트를 복사하여 명령 또는 진입점으로 설정할 수 있습니다.
COPY init-script.bash /opt/program
CMD ["/bin/bash","/opt/program/init-script.bash"]
답변2
컨테이너를 실행하기 전에 호스트 컴퓨터에서 다음 명령을 사용하여 문제를 해결했습니다.
xhost +
그 후에는 다음을 사용하여 컨테이너를 실행할 수 있습니다.
sudo docker run -it --device=/dev/video0:/dev/video0 -e DISPLAY -v /tmp/.X11-unix:/tmp/.X11-unix test1
xauth
컨테이너 내부에 설치하지 않았습니다 .