我创建了一个图像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 是否正在运行,如果没有运行则启动它。这应该确保必要的服务在容器重新启动时启动。