You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 02:25:23