Как правильно запустить графическое приложение в контейнере Docker с Qt и D-Bus?

Я пытался заставить Audex запустить внутри контейнера 16.04 LTS Docker на хосте 20.04 LTS.

Приведенный ниже метод работает нормально для приложений на основе Gtk, Я проверил это.

В текущем случае я сделал следующее:

sudo apt-get update
sudo apt-get install docker.io
sudo usermod -a -G docker $USER
# reboot

mkdir ~/docker-audex
cat > ~/docker-audex/Dockerfile << EOF
FROM ubuntu:16.04
RUN apt-get update
RUN apt-get install -y audex
CMD audex
EOF

docker build -t ubuntu:audex ~/docker-audex

Затем попытайтесь запустить его из терминала и получите вывод:

 $ docker run -e DISPLAY -v /tmp/.X11-unix: /tmp/.X11-unix --user = "$ (id --user): $ (id --group)" ubuntu: audex
QDBusConnection: соединение сеанса D-Bus, созданное до QCoreApplication. заявка
may misbehave. audex(7): KUniqueApplication: Cannot find the D-Bus
session server: "/usr/bin/dbus-launch terminated abnormally with the
following error: Autolaunch error: X11 initialization failed. " 

audex(6): KUniqueApplication: Pipe closed unexpectedly. 

or

$ docker run -e DISPLAY -e DBUS_SESSION_BUS_ADDRESS -v /tmp/.X11-unix:/tmp/.X11-unix --user="$(id --user):$(id --group)" ubuntu:audex

QDBusConnection: session D-Bus connection created before
QCoreApplication. Application may misbehave. audex(7):
KUniqueApplication: Cannot find the D-Bus session server: "Failed to
connect to socket /run/user/1000/bus: No such file or directory" 

audex(6): KUniqueApplication: Pipe closed unexpectedly.```

или

 $ docker run -e DISPLAY -e DBUS_SESSION_BUS_ADDRESS -v /tmp/.X11-unix:/tmp/.X11-unix -v / run: / run --user = "$ (id - пользователь): $ (id --group) "ubuntu: audex
QDBusConnection: соединение сеанса D-Bus, созданное до QCoreApplication. Приложение может плохо себя вести. Audex (7):
KUniqueApplication: не удается найти сервер сеанса D-Bus: "An
Политика AppArmor запрещает отправителю отправлять это сообщение
получатель; type = "method_call", sender = "(null)" (неактивно)
interface = "org.freedesktop.DBus" member = "Hello" error name = "(unset)"
required_reply = "0" destination = "org.freedesktop.DBus" (bus) " 

audex (6): KUniqueApplication: канал неожиданно закрыт. 

и окно приложения не отображалось.

Я полагаю, у меня проблема с D-Bus. Как мы можем это исправить?


Обновление, следуя @SimonSudler ответу ниже :

$ docker run -e DISPLAY -e DBUS_SESSION_BUS_ADDRESS     -v /tmp/.X11-unix:/tmp/.X11-unix -v /run:/run     --user="$(id --user):$(id --group)"     --security-opt apparmor=unconfined     ubuntu:audex

QDBusConnection: session D-Bus connection created before QCoreApplication. Application may misbehave.
QDBusConnection: session D-Bus connection created before QCoreApplication. Application may misbehave.
Error: Can not find password entry for uid 1000.
trying to create local folder //.kde: Permission denied
audex(7)/KSharedDataCache KSharedDataCache::Private::mapSharedMemory: Failed to establish shared memory mapping, will fallback to private memory -- memory usage will increase 
Usage: mv [OPTION]... [-T] SOURCE DEST
  or:  mv [OPTION]... SOURCE... DIRECTORY
  or:  mv [OPTION]... -t DIRECTORY SOURCE...
Rename SOURCE to DEST, or move SOURCE(s) to DIRECTORY.

Mandatory arguments to long options are mandatory for short options too.
      --backup[=CONTROL]       make a backup of each existing destination file
  -b                           like --backup but does not accept an argument
  -f, --force                  do not prompt before overwriting
  -i, --interactive            prompt before overwrite
  -n, --no-clobber             do not overwrite an existing file
If you specify more than one of -i, -f, -n, only the final one takes effect.
      --strip-trailing-slashes  remove any trailing slashes from each SOURCE
                                 argument
  -S, --suffix=SUFFIX          override the usual backup suffix
  -t, --target-directory=DIRECTORY  move all SOURCE arguments into DIRECTORY
  -T, --no-target-directory    treat DEST as a normal file
  -u, --update                 move only when the SOURCE file is newer
                                 than the destination file or when the
                                 destination file is missing
  -v, --verbose                explain what is being done
  -Z, --context                set SELinux security context of destination
                                 file to default type
      --help     display this help and exit
      --version  output version information and exit

The backup suffix is '~', unless set with --suffix or SIMPLE_BACKUP_SUFFIX.
The version control method may be selected via the --backup option or through
the VERSION_CONTROL environment variable.  Here are the values:

  none, off       never make backups (even if --backup is given)
  numbered, t     make numbered backups
  existing, nil   numbered if numbered backups exist, simple otherwise
  simple, never   always make simple backups

GNU coreutils online help: <http://www.gnu.org/software/coreutils/>
Report mv translation bugs to <http://translationproject.org/team/>
Full documentation at: <http://www.gnu.org/software/coreutils/mv>
or available locally via: info '(coreutils) mv invocation'
audex(7)/kdecore (KConfigSkeleton) KCoreConfigSkeleton::writeConfig:
Error: Can not find password entry for uid 1000.
X Error: BadAccess (attempt to access private resource denied) 10
  Extension:    130 (MIT-SHM)
  Minor opcode: 1 (X_ShmAttach)
  Resource id:  0x12d
X Error: BadShmSeg (invalid shared segment parameter) 128
  Extension:    130 (MIT-SHM)
  Minor opcode: 5 (X_ShmCreatePixmap)
  Resource id:  0x3a00017
X Error: BadDrawable (invalid Pixmap or Window parameter) 9
  Major opcode: 62 (X_CopyArea)
  Resource id:  0x3a00018
X Error: BadDrawable (invalid Pixmap or Window parameter) 9
  Major opcode: 62 (X_CopyArea)
  Resource id:  0x3a00018
X Error: BadDrawable (invalid Pixmap or Window parameter) 9
  Major opcode: 62 (X_CopyArea)
  Resource id:  0x3a00018
X Error: BadDrawable (invalid Pixmap or Window parameter) 9
  Major opcode: 62 (X_CopyArea)
  Resource id:  0x3a00018

добавление - ipc = host также не помогает:

$ docker run --ipc=host -e DISPLAY -e DBUS_SESSION_BUS_ADDRESS     -v /tmp/.X11-unix:/tmp/.X11-unix -v /run:/run     --user="$(id --user):$(id --group)"     --security-opt apparmor=unconfined     ubuntu:audex
QDBusConnection: session D-Bus connection created before QCoreApplication. Application may misbehave.
QDBusConnection: session D-Bus connection created before QCoreApplication. Application may misbehave.
Error: Can not find password entry for uid 1000.
trying to create local folder //.kde: Permission denied
audex(7)/KSharedDataCache KSharedDataCache::Private::mapSharedMemory: Failed to establish shared memory mapping, will fallback to private memory -- memory usage will increase 
Usage: mv [OPTION]... [-T] SOURCE DEST
  or:  mv [OPTION]... SOURCE... DIRECTORY
  or:  mv [OPTION]... -t DIRECTORY SOURCE...
Rename SOURCE to DEST, or move SOURCE(s) to DIRECTORY.

Mandatory arguments to long options are mandatory for short options too.
      --backup[=CONTROL]       make a backup of each existing destination file
  -b                           like --backup but does not accept an argument
  -f, --force                  do not prompt before overwriting
  -i, --interactive            prompt before overwrite
  -n, --no-clobber             do not overwrite an existing file
If you specify more than one of -i, -f, -n, only the final one takes effect.
      --strip-trailing-slashes  remove any trailing slashes from each SOURCE
                                 argument
  -S, --suffix=SUFFIX          override the usual backup suffix
  -t, --target-directory=DIRECTORY  move all SOURCE arguments into DIRECTORY
  -T, --no-target-directory    treat DEST as a normal file
  -u, --update                 move only when the SOURCE file is newer
                                 than the destination file or when the
                                 destination file is missing
  -v, --verbose                explain what is being done
  -Z, --context                set SELinux security context of destination
                                 file to default type
      --help     display this help and exit
      --version  output version information and exit

The backup suffix is '~', unless set with --suffix or SIMPLE_BACKUP_SUFFIX.
The version control method may be selected via the --backup option or through
the VERSION_CONTROL environment variable.  Here are the values:

  none, off       never make backups (even if --backup is given)
  numbered, t     make numbered backups
  existing, nil   numbered if numbered backups exist, simple otherwise
  simple, never   always make simple backups

GNU coreutils online help: <http://www.gnu.org/software/coreutils/>
Report mv translation bugs to <http://translationproject.org/team/>
Full documentation at: <http://www.gnu.org/software/coreutils/mv>
or available locally via: info '(coreutils) mv invocation'
audex(7)/kdecore (KConfigSkeleton) KCoreConfigSkeleton::writeConfig:
Error: Can not find password entry for uid 1000.
1
задан 12 June 2020 в 12:40

1 ответ

Запустить контейнер без профиля apparmor

Причиной этого является docker-default профиль для apparmor. С помощью этого шаблона правила интегрируются в демон docker.

Существует быстрый способ проверить, если этот профиль вызывает проблему, добавьте - security-opt apparmor = undefined для команды run :

docker run -e DISPLAY -e DBUS_SESSION_BUS_ADDRESS \
    -v /tmp/.X11-unix:/tmp/.X11-unix -v /run:/run \
    --user="$(id --user):$(id --group)" \
    --security-opt apparmor=unconfined \
    -v /dev/sr0:/dev/sr0 \
    -v /dev/cdrom:/dev/cdrom \
    --privileged \
    ubuntu:audex

Вы можете начать писать профиль устройства для audex, но я не думаю, что это стоит того. Так как audix является риппером CD, пользователю требуется некоторый «привилегированный» доступ для вставки / извлечения CD в ПК. Поэтому использование apparmor = неограниченный должно быть достаточно безопасным.

Coredump of Audex

Когда запускается audex , он выполняет несколько команд, которые он ожидает кодировать (например, faac --help ). По некоторым причинам он также выполняет mv --help , что создает странный вывод. По крайней мере, это не кажется частью проблемы. Также это происходит только перед записью файла ~ / .kde / share / config / audexrc . После этого остается только сбой ...

Глядя на дамп ядра audex:

gdb /usr/bin/audex core.audex.3225
...
(gdb) bt
#0  0x00007f8799abda7f in KUrl::KUrl(QString const&) () from /usr/lib/libkdecore.so.5
#1  0x00007f879b4c7245 in KCompactDisc::cdromDeviceUrl(QString const&) () from /usr/lib/libkcompactdisc.so.4
#2  0x0000000000423469 in MainWindow::MainWindow (this=0x23ef580, parent=<optimized out>, __in_chrg=<optimized out>, 
    __vtt_parm=<optimized out>) at /build/buildd/audex-0.78/mainwindow.cpp:39
#3  0x000000000041a159 in main (argc=3, argv=0x7ffd939ccf58) at /build/buildd/audex-0.78/main.cpp:46

Я вижу, что audix умирает при попытке прочитать URL-адрес устройства CD-ROM. Я добавил / dev / sr0 и / dev / cdrom , чтобы приспособиться к этому, но это не имеет никакого эффекта (, см. Пример ручного разбиения с докером ). Также не помогло добавление пользователя audex в контейнере в группу cdrom .

Это похоже на ошибку в старой версии audix от 16.04, которая ожидает устаревшую строку URL.

Может быть невозможно запустить audex из ubuntu: 16.04 в текущей системе Ubuntu из-за некоторого отсутствующего «старого» поведения KDE. Однако есть Neon / Docker от KDE, но для него также требуется KDE на хосте.

1
ответ дан 19 June 2020 в 21:35

Другие вопросы по тегам:

Похожие вопросы: