我已经开始尝试将 Docker 用于我的日常开发环境,以便(原则上)轻松地从任意机器上工作,而无需进行大量设置。我的环境基于 Emacs+Slime,运行自定义 Common Lisp 映像(尽管我不认为 Slime/Common Lisp 部分很重要——我很确定普通的 Emacs 会遇到下面描述的相同问题)。
当前主机环境是 Windows10/WSL2,Docker 在 WSL2 中运行。我从 Windows Terminal WSL Ubuntu shell 启动我的容器,如下所示:
docker run -d -it -rm -e DISPLAY="${DISPLAY}" <my-container-name> <command-within-container-to-launch-emacs>
其中我已将 ${DISPLAY} 设置为我的 Windows 主机的 IP 地址,并.profile
在登录时在我的 WSL Ubuntu 中使用以下命令进行设置:
export DISPLAY=$(cat /etc/resolv.conf | grep nameserver | awk '{print $2; exit;}'):0.0
此docker run
命令顺利地通过我安装的 X410 XWindow 客户端(设置为“允许公共访问”)在我的 Windows10 桌面上启动了我的 Emacs 窗口。
如果我正在积极使用系统并与 emacs 窗口交互,它会在无限的时间内完美运行。
如果系统闲置哪怕很短的时间,也会出现问题(我认为主机甚至不必进入睡眠状态——只需让 emacs 窗口闲置几分钟就会出现问题)。问题是 emacs 窗口(以及整个 docker 容器)只是默默退出。
有人能指导我如何解决容器静默退出的问题吗?例如,我应该查看某个日志文件吗?
由于这种情况似乎只发生在 X Window 应用程序中,也许这是 X Window 或 X410 社区的问题,而不是 docker 问题?如果是这样,请随时将我推到那里。
或者也许这是一个 emacs(gtk)特定的问题,我需要联系该社区?
或者也许是 WSL2 的问题?(尽管直接从 WSL2 Ubuntu Windows 终端启动的 emacs(gtk)也通过 X410 显示,即使在机器(LG Gram 笔记本电脑)睡眠和唤醒期间也能无限期地保持运行。
但是除了使用 docker 之外,我在任何其他环境中都没有遇到过 emacs-gtk 的这个问题,所以我想先在这里问一下。
任何指导都值得赞赏。
谢谢
答案1
解决了!
我遇到过和你一样的问题,最近才找到一个可行的解决方案。我认为这与 Emacs 本身无关。
我曾尝试使用 Vcxsrv 和 X410 在 Windows 中运行图形化 Linux 应用程序,然后我注意到 x410 有一个新版本 3.1.0,它支持VSock。我认为这是关键,因为主机 Windows 和 WSL2 之间的 IP 流量似乎存在一些问题。
(通常这是不可见的,但当 X-server 使用 tcp-ip-address 进行通信时就会可见)
下载 X410 最新版本并设置 vsock 后,我的所有问题都解决了。他们针对 vsock 的解决方案可能也适用于 vcxsrv,但我没有尝试过,因为 x410 在图形中提供了更好的细节,我更喜欢这一点。
为什么使用 vsock?
使用 vsock 可以独立于 TCP 和 IP 地址,这对我来说是个问题。有了这个解决方案,我可以切换网络而不会丢失任何 Linux 应用程序 GUI。快乐的日子!
这是我做的:
下载适用于 Windows 的 X410 版本 3.1.0 并安装 -https://x410.dev/#download
- 开始_X410:
/mnt/c/Program\ Files/Choung\ Networks/X410/X410.exe &
使用选项 VSOCK OPTION 2 修改 XCB -https://x410.dev/cookbook/transparently-adding-native-support-for-vsock-in-x11-apps
- 下载预建库 -https://gitlab.com/vsockfy/libxcb-1.14-vsock/-/releases/v1.14-vsock
- 重命名旧的 libxcb.so:
sudo mv /usr/lib/x86_64-linux-gnu/libxcb.so.1.1.0 /usr/lib/x86_64-linux-gnu/libxcb.backup.so.1.1.0
- 将下载的文件复制到位(预先移动到您的文件夹):
sudo cp libxcb.se.1.1.0 /usr/lib/x86_64-linux-gnu/libxcb.so.1.1.0
- 验证功能:(
export DISPLAY=vsock/:0; xset q
如果成功则应响应‘键盘控制:......’)
将别名和函数添加到您的 .bashrc 或类似文件中:
- 添加别名以启动 X410
alias xlaunch='/mnt/c/Program\ Files/Choung\ Networks/X410/X410.exe &'
- 添加功能:
function x_display {
export DISPLAY="vsock/:0"
export QT_SCALE_FACTOR=1
export GDK_SCALE=1
if ! timeout 1s xset q &>/dev/null; then
taskkill.exe /IM X410.exe &> /dev/null && echo "Running X was killed!"
echo "Starting X..."
xlaunch
sleep 2
fi
echo "X for WSL instantiated on $DISPLAY"
}
- 添加别名来启动 intellij(我这样做的原因):
alias intellij='x_display; /opt/idea/bin/idea.sh &> /dev/null &'
- 保存你的 .bashrc
- 获取已更改的 .bashrc:source ~/.bashrc
- 启动 Intellij:intellij