在Alpine Docker镜像中运行Sway窗口管理器的问题求助(含Docker Compose)
在Alpine Docker镜像中运行Sway窗口管理器的问题排查
问题背景
基于Alpine latest构建Docker镜像并安装Sway窗口管理器后,使用docker run命令可启动Sway但伴随若干错误,而通过Docker Compose则完全无法启动。
1. Docker Run启动情况
启动命令:
docker run -it -e XDG_RUNTIME_DIR=/home/Raju \ -e WAYLAND_DISPLAY=wayland-0 \ -v $XDG_RUNTIME_DIR/$WAYLAND_DISPLAY:/home/Raju/$WAYLAND_DISPLAY \ --user=Raju \ -e WLR_LIBINPUT_NO_DEVICES=1 \ compose-sway sway
启动后错误信息:
00:00:00.040 [wlr] [render/wlr_renderer.c:322] drmGetDevices2 failed: No such file or directory 00:00:00.040 [wlr] [types/wlr_drm_lease_v1.c:705] No DRM backend supplied, failed to create wlr_drm_lease_v1_manager 2022-10-15 23:48:27 - [main.c:340] Found config * for output WL-1 ((null)) 00:00:00.014 [swaybar/tray/tray.c:42] Failed to connect to user bus: No such file or directory
2. Docker Compose启动情况
docker-compose.yml配置(存在语法错误):
version: "2.4" services: sway: image: compose-sway - XDG_RUNTIME_DIR=/home/Raju/ - WAYLAND_DISPLAY=wayland-0 \ - --user=Raju \ - WLR_LIBINPUT_NO_DEVICES=1 \ command: /bin/sh -c "unset DISPLAY && exec sway " tty: true stdin_open: true ports: - 8081:5900 volumes: - $XDG_RUNTIME_DIR/$WAYLAND_DISPLAY:/home/Raju/$WAYLAND_DISPLAY
启动后错误信息:
sway_1 | 00:00:00.001 [wlr] [backend/wayland/backend.c:550] Could not connect to remote display: No such file or directory sway_1 | 00:00:00.001 [sway/server.c:56] Unable to create backend compose_sway_1 exited with code 1
3. Dockerfile内容
FROM alpine:latest RUN apk add alpine-conf RUN apk update RUN apk add build-base RUN apk add eudev RUN apk add ttf-dejavu RUN apk add seatd RUN apk add sway sway-doc RUN apk add xwayland RUN apk add foot RUN apk add bemenu RUN apk add swaylock swaylockd RUN apk add swaybg RUN apk add swayidle RUN apk add rofi RUN apk add waybar RUN apk add dbus RUN apk add wofi RUN apk add elogind polkit-elogind RUN apk add wayvnc RUN apk add mesa-dri-gallium RUN apk add libva-intel-driver RUN apk add xdg-desktop-portal RUN apk add xdg-desktop-portal-wlr RUN adduser Raju -D -G wheel RUN adduser Raju input RUN adduser Raju video COPY xdg_runtime_dir.sh root/etc/profile.d/xdg_runtime_dir.sh RUN /bin/sh -c "mkdir -p root/.config/sway" RUN /bin/sh -c " cp /etc/sway/config root/.config/sway/config" RUN chmod a+s /etc/sway/config USER Raju EXPOSE 5900 CMD dbus-run-session -- sway
已查阅Alpine官方Wiki中Sway相关内容,但仍未定位到问题点,请求协助排查。
问题修复方案
1. 修正Docker Compose配置
原配置存在语法错误:环境变量未放在environment字段下,--user是容器运行参数而非环境变量。正确配置如下:
version: "2.4" services: sway: image: compose-sway user: Raju environment: - XDG_RUNTIME_DIR=/home/Raju - WAYLAND_DISPLAY=wayland-0 - WLR_LIBINPUT_NO_DEVICES=1 command: /bin/sh -c "dbus-run-session -- sway" tty: true stdin_open: true ports: - 8081:5900 volumes: - $XDG_RUNTIME_DIR/$WAYLAND_DISPLAY:/home/Raju/$WAYLAND_DISPLAY devices: - /dev/dri:/dev/dri
2. 逐个处理错误点
- DRM相关错误:容器无主机显卡设备访问权限,添加
devices字段挂载/dev/dri设备,Dockerfile中已将Raju加入video组,无需额外操作。 - 用户总线连接失败:必须通过
dbus-run-session -- sway启动Sway,确保用户总线正常运行。 - 远程display连接失败:除修正语法错误外,确保主机
$XDG_RUNTIME_DIR/$WAYLAND_DISPLAY路径存在,若仍有问题可添加network: host直接使用主机网络。
3. 优化Dockerfile
- 合并apk命令减少镜像层数,添加
--no-cache清理缓存:RUN apk update && apk add --no-cache alpine-conf build-base eudev ttf-dejavu seatd sway sway-doc xwayland foot bemenu swaylock swaylockd swaybg swayidle rofi waybar dbus wofi elogind polkit-elogind wayvnc mesa-dri-gallium libva-intel-driver xdg-desktop-portal xdg-desktop-portal-wlr - 修正配置文件路径:将Sway配置复制到运行用户Raju的目录下,并修正权限:
RUN mkdir -p /home/Raju/.config/sway && cp /etc/sway/config /home/Raju/.config/sway/config && chown -R Raju:Raju /home/Raju/.config/sway - 移除不必要的
chmod a+s /etc/sway/config命令,避免权限风险。
4. 优化后的Docker Run命令
docker run -it --device=/dev/dri:/dev/dri \ -e XDG_RUNTIME_DIR=/home/Raju \ -e WAYLAND_DISPLAY=wayland-0 \ -v $XDG_RUNTIME_DIR/$WAYLAND_DISPLAY:/home/Raju/$WAYLAND_DISPLAY \ --user=Raju \ -e WLR_LIBINPUT_NO_DEVICES=1 \ compose-sway dbus-run-session -- sway
内容的提问来源于stack exchange,提问作者Raja Muneer
相关产品推荐
相关产品推荐

