通过 runuser 启动时,docker 中的 tmux 不会根据窗口大小的变化进行调整

通过 runuser 启动时,docker 中的 tmux 不会根据窗口大小的变化进行调整

我的开发环境是一个运行的 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,但我真的不知道那是什么......

相关内容