Обновление: Здесь приведены некоторые инструкции по запуску приложений с графическим интерфейсом в докере и MAC, которые могут быть полезны (если вы их еще не видели).
У меня есть док-контейнер с ROS, который я использую для запуска rviz
и других приложений пользовательского интерфейса (приложения ROS на основе QT не работают в KDE Neon).
docker-compose.yml
содержит следующее:
##############
version: "3.8"
services:
ros:
container_name: ros1
network_mode: host
# I created my own image, with my own user, etc
image: YOUR_IMAGE
volumes:
# you can ignore this line if you want (I'll explain below)
# - /home/ichramm/devel/robots:/home/ichramm/devel/robots
- /etc/localtime:/etc/localtime:ro
- /tmp/.X11-unix:/tmp/.X11-unix:ro
- /home/ichramm/.Xauthority:/home/ichramm/.Xauthority:ro
- /run/user/1000:/run/user/1000:ro
- /run/user/1000/bus:/run/user/1000/bus:ro
command: /entrypoint.sh
environment:
USER: ichramm
DISPLAY: ${DISPLAY}
XDG_RUNTIME_DIR=/tmp/runtime-${USER}
DBUS_SESSION_BUS_ADDRESS: unix:path=/run/user/1000/bus
devices:
#- "/dev/ttyUSB0:/dev/ttyUSB0"
#- "/dev/dri/card0:/dev/dri/card0"
#- "/dev/dri/card1:/dev/dri/card1"
Попробуйте сопоставить смонтированные тома с вашей системой. Я понимаю, что у вас есть MAC, а значит, это может вам не подойти.
У меня это работает, но я не использую ssh, я использую только два скрипта:
1.
❯ cat docker-run.sh
#!/bin/bash
docker exec -ti -w $(pwd) ros1 ./wrapper.sh $@
-
❯ cat wrapper.sh
#!/bin/bash
export XDG_RUNTIME_DIR=/tmp/runtime-$USER
source env.sh
$@
Чтобы это работало, вам необходимо следующее:
- Смонтировать рабочий каталог в контейнере (см. строку с комментариями выше)
- Есть файл
env.sh
, который является источником setup.bash
ROS и рабочей области devel/setup.bash
.
Конечно, опыт работы с этими сценариями ограничен, поэтому я также вхожу в докер напрямую, используя следующее:
❯ cat enter-env.sh
#!/bin/bash
docker exec -ti -w /home/ichramm/devel/robots ros1 /bin/bash
Это работает только потому, что структура каталогов контейнера совпадает со структурой хоста. (Обратите внимание, что я все равно монтирую только каталог разработки). Я также добавил пользователя с тем же именем UID и GID, что и у хоста, чтобы предотвратить проблемы с правами доступа к файлам.
Если вы не можете заставить его работать, я предлагаю вам обратиться к виртуальной машине. Просто установите Ubuntu 20.04 без пользовательского интерфейса (вы можете отключить его позже с помощью sudo systemctl set-default multi-user
) и используйте SSH с переадресацией X. Я работал с этой настройкой, переключаясь на докер, и у меня все еще есть виртуальная машина на случай, если что-то случится.
Обновление: Имейте в виду, что я делаю некоторые потенциально небезопасные вещи, такие как монтирование .Xauthority
. Это работает для меня, потому что никто другой не имеет доступа к моему компьютеру.
Когда вы подключаетесь к этой удаленной системе, каково значение переменной среды DISPLAY в вашей локальной системе (в которой вы запускаете ssh)? Каково значение DISPLAY в удаленной системе (той, к которой вы подключаетесь для запуска ros)? Какой X-сервер вы используете в локальной системе?
Во-первых, я должен сказать, что я новичок и, в общем, я не уверен, что я делаю. Если я запускаю
echo $DISPLAY
локально, это то, что появляется «/private/tmp/com.apple.launchd.ZDXU5Z6owS/org.xquartz:0». Когда я делаю то же самое в удаленной системе, появляется «localhost: 10.0». Я использую XQuartz, который «является версией X.Org X Window System, работающей на macOS». Спасибо.вы пробовали с флагом
-Y
?@JuanR Да, я только что попробовал, и ничего не изменилось.