runuser から起動すると、docker の tmux はウィンドウサイズの変更に応じて調整されません。

runuser から起動すると、docker の tmux はウィンドウサイズの変更に応じて調整されません。

tmux 3.1c私の開発環境は通常、Windows端末で実行されているdockerインスタンスです。起動スクリプトはホスト名と$USER一致するuid/gid値を使用して新しいユーザーアカウントを作成するため、環境内のファイルを変更すると正しい権限が得られます。このコマンドを使用してユーザーのシェルを起動しますrunuser

これはほとんどの場合うまく機能しますが、インスタンスとtmuxを起動してウィンドウのサイズを変更すると、tmuxインスタンスのサイズは変更されません。stty sizeまた、更新されずに無効な値が表示されます。

これはDockerインスタンス内でのみ発生します。 Windows端末内部のホスト自体でtmuxを実行しても問題ありません。実際、通常のdockerインスタンスでtmuxを実行すると問題はありませんが、$USERそのアカウントを使用して実行するとrunuser競合が発生します。

複雑に見えるかもしれませんが、私が考えることができる最小の再現可能な例です。使用を削除しrunuserて簡単に実行すると、roottmuxを実行すると端末が正しく調整されます。対照的に、tmuxを使用して起動しrunuserないと、出力stty sizeも正しく調整されます。したがって、問題が発生したdocker / runuser / tmuxの相互作用に関連しています。

以下は、私が思いついた再現可能な最小の例です。

docker-compose.yml

version: "3.3"
services:
  test:
    build: .
    stdin_open: true
    tty: true
    hostname: "test"

ドッカーファイル

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

adduser.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

start.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です。
  • ホストOSは、Debian BusterのWSL2インスタンスを実行するWindows 10です。

ベストアンサー1

私が見つけた解決策を投稿します。なぜrunuser失敗したのかまだ理解していないので、これは答えではありませんが、交換するのはトリックrunuser -l $USER -c '/bin/bash'ですlaunch.shsudo -u $USER '/bin/bash'

runuserそれで、tmuxand / orの間に奇妙なことが起こっていますが、dockerそれが何であるかよくわかりません...

おすすめ記事