远程连接Debian容器出现一定错误(xrdp & sesman)

远程连接Debian容器出现一定错误(xrdp & sesman)

我创建了一个图像Dockerfile这是一个Debian 书虫有用户界面的XFCE以及您连接的地方通过 xrdp(远程桌面)。

让我们来解决这个问题:

如果我创建一个全新容器有了这张图片,那么我可以登录使用 RDP 到 UI,也注销再次登录。只有当我重新开始容器并想要再次登录(在xrdp页面)然后我得到一个 sesman 错误(奇怪的是 sesman 不是活动/开始)。

但如果我启动塞斯曼一切"/usr/sbin/xrdp-sesman"恢复正常直到重新开始容器。

这是我这边的逻辑错误吗?或者这是 sesman 的一个已知问题。

docker文件:

#use the debian bookworm image
FROM debian:bookworm

#update all package directories
RUN apt update

#install all needed programs like
#XFCE for UI
#xrdp for connecting via RemoteDesktop
#dbus-x11 for that you can connect to the desktop at all (otherwise the connection w>
#xfce4-goodies for the Xfce4 Desktop Environment (https://packages.debian.org/de/sid>
RUN apt install -y xrdp xfce4 dbus-x11

#install usefull tools like: nano, wget, curl and sudo
RUN apt install -y nano wget curl sudo

#FIX: removed the annoying screen "Plugin "Power Manager Plugin" unexpectedly left t>
RUN apt remove xfce4-power-manager-plugins -y

#clean up
RUN apt clean && apt autoremove -y

#create default user called "user", with password "changeme"
RUN useradd -m -s /bin/bash -p $(openssl passwd -1 changeme) user

#copy files
COPY /data/startScript.sh /

#make the start script runable
RUN chmod +x /startScript.sh

#expose the RDP port
EXPOSE 3389

#start the start script and run the container
CMD ["/startScript.sh"]

启动脚本

#!/bin/bash

#start the xrdp session manager
/usr/sbin/xrdp-sesman

#start xrdp overall
/usr/sbin/xrdp -n

用户数据:

Username => user
Password => changeme

复制粘贴命令:

docker build -t debianxfcerdp .
docker run -d -p 3399:3389 --name test01 debianxfcerdp 

答案1

Docker 容器中 xrdp 遇到的问题可能与容器内服务的启动和管理方式有关。容器重启时,可能无法自动触发xrdp-sesman服务,导致连接失败。这可能是手动启动 sesman 可以解决问题直到容器重新启动的原因。

一种可能的解决方案可能涉及重新配置 Docker 容器的入口点或启动脚本,以确保基本服务(例如 xrdp-sesman)在容器初始化时启动。这可能需要通过容器内的进程管理器或脚本对其进行管理。

在 Dockerfile 中进行的调整:

#copy the startup script into the container
COPY startScript.sh /usr/local/bin/startScript.sh

#grant execute permissions to the script
RUN chmod +x /usr/local/bin/startScript.sh

# Set the script as entry point to run on container start
ENTRYPOINT ["/usr/local/bin/startScript.sh"]

此外,必须修改 startScript.sh 才能正确启动 xrdp 服务:

#!/bin/bash

# Function to check and start the sesman service if not running
start_sesman() {
    if ! pgrep -x "xrdp-sesman" > /dev/null; then
        echo "xrdp-sesman not running. Starting sesman..."
        /usr/sbin/xrdp-sesman
    else
        echo "xrdp-sesman is already running."
    fi
}

# Start sesman
start_sesman

# Start xrdp
/usr/sbin/xrdp -n

此调整后的设置将启动 startScript.sh 作为容器的入口点。它包含一个函数来验证 xrdp-sesman 是否正在运行,如果没有运行则启动它。这应该确保必要的服务在容器重新启动时启动。

相关内容