Запуск GUI-приложений в Docker-контейнере.
1. На машине с #Wayland и без #XOrg
2. Rootless-контейнер #Docker
3. Тяжёлое мультимедиа #Chromium
Запуск контейнера:
docker run --rm -it \
-e XDG_RUNTIME_DIR="/run/user/$(id -u)" \
-e DBUS_SESSION_BUS_ADDRESS=unix:path=$XDG_RUNTIME_DIR/bus \
-e WAYLAND_DISPLAY=$WAYLAND_DISPLAY \
-v $XDG_RUNTIME_DIR/pipewire-0:$XDG_RUNTIME_DIR/pipewire-0 \
-v $XDG_RUNTIME_DIR/$WAYLAND_DISPLAY:$XDG_RUNTIME_DIR/$WAYLAND_DISPLAY \
-v $XDG_RUNTIME_DIR/bus:$XDG_RUNTIME_DIR/bus \
-v $XDG_RUNTIME_DIR/pulse/native:$XDG_RUNTIME_DIR/pulse/native \
--device /dev/dri \
--device /dev/snd \
имя-образа-для-контейнера \
chromium --no-sandbox --ozone-platform=waylandНе обязательно с --rm (даёт автоматическое удаление контейнера после остановки\выхода из браузера).Можно и оставлять контейнера в остановленном состоянии. Однако, если это делается ради сохранения данных, то это некорректно. Данные лучше хранить в монтирующихся каталогах основной системы, нежели в volumes контейнерной среды.
Где взять контейнер?
Создать пустой каталог и поместить в него вот такой
chromium-debian.Dockerfile файл:FROM debian:12
RUN apt-get update && \
apt-get install -y chromium --no-install-recommends && \
rm -rf /var/lib/apt/lists/*Зайдя в это каталог, через cd, собрать образ:docker build . \
--file chromium-debian.Dockerfile \
-t имя-образа-для-контейнераRootless?
Обычные rootful-контейнеры Docker уже не модно и не профессионально (запускают процессы из под root'а системы).
Годный экскурс как сделать на машине rootless-контейнеры — https://rootlesscontaine.rs/ -> «Getting Started».
Официальная документация — https://docs.docker.com/engine/security/rootless/
И даже пакет для разворачивания есть.
Как это работает
Внутри контейнера учётная запись пользователя как бы является root-ом, но это локально, а на самом деле запуск им процессов в основной системе происходит из под обычного пользователя. Того самого, который создал контейнер (то самое
$(id -u) в параметрах).За счёт файлов
/etc/subuid и /etc/subgid, которые содержат проецирование идентификаторов:$ cat /etc/subuid
username:100000:65536Зачем?
Некоторый серьёзный софт встречается лишь для определённых дистрибутивов #linux'а, а на компьютере у человека может быть экзотичный дистрибутив.
Если в контейнере с другим линухом спокойно работает такая тяжёлая вещь как Chromium с онлайновой аудио-видео мультимедией, то значит высока вероятность, что и остальной софт будет успешно вращаться.
И не всем разработчикам подходит запуск серверной части VSCode внутри контейнера с toolchain'ом, чтобы подключаться потом через веб-интерфейс. Иногда надо запускать и обычную GUI-тулзы или другое IDE-подобное. Причём, работая сразу с несколькими дистрибутивами, в разных контейнерах, на одной машине.
#containerization #контейнеризация #rootless @Russia @rur