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.sh입니다 .sudo -u $USER '/bin/bash'

runuser그래서 tmuxand/or 사이에 이상한 일이 벌어지고 있는데 docker그게 뭔지 잘 모르겠어요...

관련 정보