我的开发环境是一个运行的 docker 实例tmux 3.1c
,通常在 Windows 终端中运行。启动脚本创建一个具有主机名$USER
和匹配uid
/gid
值的新用户帐户,这样,如果我从环境中修改文件,它们就会获得正确的权限。它使用该命令为用户启动一个 shell runuser
。
这在大多数情况下工作正常,但如果我启动实例和 tmux,然后调整窗口的大小,我的 tmux 实例不会调整。stty size
也不会更新并显示错误的值。
这仅发生在 docker 实例内,如果我在 Windows 终端内的主机本身上运行 tmux,那就没问题。事实上,如果我在普通的 docker 实例中运行 tmux 也没有问题,但如果我$USER
使用它的帐户启动runuser
它就会崩溃。
这可能看起来很复杂,但这是我能想到的最小的可重现示例。如果我删除使用runuser
并简单地运行,因为root
运行 tmux 时终端会正确调整。相反,如果我确实使用runuser
但不启动 tmux,那么 的输出stty size
也会正确调整。所以这与 docker/runuser/tmux 的交互有关,其中出现了问题。
这是我设法想出的最小的可重现示例:
docker-compose.yml
version: "3.3"
services:
test:
build: .
stdin_open: true
tty: true
hostname: "test"
Dockerfile
FROM python:3.9.10
RUN apt-get update
RUN apt-get install -y less sudo tmux
COPY add_user.sh /tmp/add_user.sh
添加用户.sh
#!/bin/bash
USERNAME=$1
GROUPNAME=$1
USERID=$2
GROUPID=$3
addgroup --gid $GROUPID $GROUPNAME
adduser --uid $USERID --gecos "" --disabled-password --gid $GROUPID $USERNAME
chown -R $USERNAME:$GROUP /home/$USERNAME
启动.sh
USERID=$(id -u ${USER})
GROUPID=$(id -g ${USER})
CMD="/tmp/add_user.sh $USER $USERID $GROUPID && runuser -l $USER -c '/bin/bash'"
docker-compose --file $(dirname $0)/docker-compose.yml run --rm test bash -c "$CMD"
复制步骤
docker compose build && ./launch.sh
现在打开 tmux 并检查窗口大小:
tmux
stty size
就我而言,这会产生以下结果:
quant@test:~$ stty size
18 106
现在调整窗口的大小。在我的例子中,这会扰乱 tmux 窗口,将光标移动到屏幕的错误部分,并stty size
产生与之前相同的输出:
退出 tmux 并运行stty size
会产生正确的结果:
quant@test:~$ tmux
[exited]
quant@test:~$ stty size
19 69
有什么想法可能导致这种情况吗?
系统详细信息:
- Tmux版本是3.1c
- Windows 终端是 1.13.11431.0
- 主机操作系统是运行 Debian Buster 的 WSL2 实例的 Windows 10
答案1
我将发布我找到的解决方法。这几乎不是一个答案,因为我仍然不明白为什么runuser
会失败,但替换runuser -l $USER -c '/bin/bash'
为launch.sh
可以sudo -u $USER '/bin/bash'
解决问题。
runuser
所以和tmux
/之间正在发生一些奇怪的事情docker
,但我真的不知道那是什么......