Could not load the Qt platform plugin "xcb"

yun·2023년 12월 8일
0

Docker

목록 보기
7/7

문제

: 도커에서 Qt를 못 찾는다.

해결과정

opencv-python-headless를 설치하라는 팁도 있었는데 imshow 같은 함수를 사용할 수 없게 되기 때문에 현재 프로젝트에는 맞는 방법이 아니다.

이것저것 설치해보라는 팁이 많았지만, 아무리 설치를 해봐도 도커 빌드 시간만 늘어나고 해결되지 않았다.

이후 compose.yaml에 환경 변수를 추가해 줬더니 GUI 창은 나왔는데,

environment:
  - DISPLAY=unix$DISPLAY
  - QT_DEBUG_PLUGINS=1
  - QT_QPA_PLATFORM=xcb
  - QT_QPA_PLATFORM_PLUGIN_PATH=/usr/lib/x86_64-linux-gnu/qt5/plugins
  - QT_PLUGIN_PATH=/usr/lib/x86_64-linux-gnu/qt5/plugins

위 링크와 현재 로컬 환경에서의 qt5 플러그인의 위치가 달라서 locate로 경로를 찾아줘야 했다.

sudo apt-get -y install mlocate
locate qt | grep 'plugins$'

사용 중인 환경에 locate가 없어서 mlocate를 설치 후, plugins로 끝나는 qt가 있는 경로를 검색했다.

그리고 Qt를 호출하는 python 파일에서 아래 내용도 추가해 줘야 한다.

import os

os.environ.pop("QT_QPA_PLATFORM_PLUGIN_PATH")

이렇게 하고 나면 WindowClass는 호출이 되어서 GUI 창이 정상적으로 표시된다.

그런데 웹캠에서 받아온 프레임을 도커에서 subscribe해서 화면에 표시하려고 하면

또 xcb를 load하지 못해서 ros2run이 종료된다.

pip3 install --no-binary opencv-python opencv-python

이렇게 설치한 후에 xcb를 인식하는 데 성공했다.

--no-binary 옵션은 패키지를 binary로 설치하지 않는다는 뜻으로, 의존성 이슈가 있을 때 사용해 볼 수 있는 것 같다.

다른 방법 시도

: GUI를 도커에서 구현하지 말고 로컬에 분리하자

해결된 줄 알았는데 계속해서 발생하는 참사

실제 설치한 버전은 5.15.3인데 LD_LIBRARY_PATH에서 꼬인 건지(PySide2가 5.15.2를 사용) 계속해서 버전 충돌이 난다며 프로그램이 종료된다.

거의 이틀 동안 Qt 버전을 몇 개나 삭제 후 재설치했고, 그 과정에서 로컬 환경도 날릴 뻔했다. 모니터 화면을 사용해야 하고 로컬 웹캠에서 받은 이미지와의 통신이 필요해서 사실상 로컬과 도커의 환경 분리가 명확히 되지 않는다.

도커에 집착하다가 로직을 못 짜고 있는 상황 ㅠㅠ

정 안 되면 로컬에서 다 실행할 수도 있다. 기능 구현 완료 후에 다시 생각해 보기로 한다.

0개의 댓글