2016-08-05 3 views
9

다음 동작을 변경하는 방법을 알고 싶습니다. 터미널에 행이 있다고 가정 해 봅시다. 나는 항상 내 단말기의 크기에도 불구하고 나에게 24을 제공 docker run --rm -it ubuntu:16.04 tput lines으로 컨테이너를 호출하고있을 때, 당신이 볼 수 있듯이도커 도커 내에서 터미널이 바뀌는 전화선 번호

$ tput lines # my terminal 
28 
$ docker run --rm -it ubuntu:16.04 tput lines # docker container 
24 ## WHY?? 
$ docker run --rm -it ubuntu:16.04 bash # docker container inside command 
[email protected]:/# tput lines 
28 

이 경우에도 모든 결과가 28해야한다 : 그럼 다음 명령을 사용하여 . 이것은 우분투 컨테이너뿐만 아니라 데비안 (docker run --rm -it debian tput lines)으로 시도한 결과 같은 결과를 얻었습니다.

이 목적은 터미널에있는 라인을 고려하여 mdp presentation tool을 사용하는 것입니다. 구현이 실패하면 다른 사람의 docker implementation을 시도했지만 같은 오류가 발생했습니다.

여기 내 오류가 이미지에 있어요 :

Docker number of lines in terminal changing inside docker

사람이 될 수있는 방법이가 해결 될 수있는 어떤 생각을 가지고 있습니까? ENTRYPOINTsh -c 인 디폴트를 의미

CMD ["/bin/bash"] 

을 (그리고 tput 그 이미지 만 bash는 설정 될 수 terminfo 데이터베이스를 사용하기 때문에 I는 sh 세션에서 잘 tput line 작품을 의심 :

답변

5

Ubuntu Dockerfile 포함)

ENTRYPOINTbash -c으로 덮어 쓰고 더 잘 작동하는지 확인해보십시오.

docker run --entrypoint /bin/bash --rm -it ubuntu:16.04 -i -c 'tput lines' 
24 

나는 사용자 정의 이미지를 정의하는 옵션을 선택합니다 :하지만 명령 줄에서 작동하지 않습니다

.

FROM ubuntu:16.04 
ENTRYPOINT ["/bin/bash", "-c"] 

결과는 비록 동일합니다

docker run --rm -it u 'tput lines' 
24 

그러나 이것은 "작동"

FROM ubuntu:16.04 
ENTRYPOINT [ "/bin/bash" ] 

으로 :

[email protected]:/c/Users/vonc/prog/testsu$ docker run --rm -it u -i -c 'ls; tput lines' 
bin boot dev etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var 
48 

동기화 문제가있을 수 있습니다, 같은 명령이 때로는.사실

, 다음과 같은 항상 반환 "하지 (24)을"

FROM ubuntu:16.04 
ENTRYPOINT [ "/bin/bash", "-l", "-i", "-c" ] 

docker run --rm -it u -c 'sleep 0.1; ls; tput lines' 
48 

OP silgonin the comments 제안 :

docker run --rm -it --entrypoint /bin/bash ubuntu:16.04 -c "sleep 0.1 && tput lines" 

BMitch로 의견 below :

잠의 성공을 감안할 때, 도커는 실행 명령으로 컨테이너를 회전시키고 한 번 가동하면 클라이언트가 실행중인 컨테이너에 연결됩니다. 일반적으로 밀리 초가 걸립니다. 나에게 또 다른 생각했다

: 연결된 세션 내에서

[email protected]:/c/Users/vonc/prog/testsu$ 
docker run --entrypoint='/bin/bash' --name ub -d -it ubuntu:16.04 
    0d9b8783afbb5e3ff4232da071d3f357985351ea1ce4d142bf6617ac456fb76b 
[email protected]:/c/Users/vonc/prog/testsu$ 
d attach ub 
    [email protected]:/# tput lines 
    48 
    [email protected]:/# exit 
exit 
[email protected]:/c/Users/vonc/prog/testsu$ drmae 
0d9b8783afbb5e3ff4232da071d3f357985351ea1ce4d142bf6617ac456fb76b 

tput lines 잘 작동합니다. 그 이후 (시 -it

컨테이너가 생성

, 다음 기본값 (80x24)로 시작하고, :
in the comments


thajeztah을 추가합니다 (drmae 별명에 "How to remove old and unused Docker images"참조)), 세션이 첨부됩니다.
세션이 터미널의 크기를 지정하고 있습니다.

"Resize a container TTY"API를 참조하십시오.

DEBU[0244] Calling POST /v1.25/containers/c42fd5c4eb79c06fd7f9912b8359022f7d93887afbb33b57a67ed8bb7bfee4‌​3a/resize?h=46&w=221 

자세한 내용은 docker issue 25450을 참조하십시오.
이것은 issue 10341 "Container create or start should accept height/width params"과 관련 있습니다.

이 실제로 실행 스펙 (opencontainers/runtime-spec PR 563) 내에서 다시 팝업했습니다 Aleksa Sarai (cyphar)은 (2016년 9월)를 추가합니다.
기본적으로 Windows는 처음 시작할 때 콘솔 크기를 설정할 수 있어야하므로 모든 플랫폼에 콘솔 크기가 추가 될 수 있습니다. api/client/container/run.go의 코드 밖으로


OP silgon 포인트 :

논리적 인 질문
// Telling the Windows daemon the initial size of the tty during start makes 
// a far better user experience rather than relying on subsequent resizes 
// to cause things to catch up. 
if runtime.GOOS == "windows" { 
    hostConfig.ConsoleSize[0], hostConfig.ConsoleSize[1] = dockerCli.GetTtySize() 
} 

:

그것은, 의미뿐만 아니라 리눅스에서이 속성을 사용하여 만들 것 그 값을 사용하여 초기 콘솔 크기를 설정합니까?

Kenfe-Mickaël Laventure (mlaventure)는에, 새로운 패치 Docker 1.13로 만들 수 있습니다.

+0

명령이 작동하지 않습니다 (적어도 나를위한 것은 아닙니다).'docker : 데몬으로부터의 오류 응답 :/bin/bash -c : 이상한 파일이나 디렉토리'라는 오류가 발생합니다. 그러나 명령에 따라 나는'docker run --rm -it 우분투 : 16.04 bash -c "tput lines"을 사용할 수 있다고 생각 했으므로 나는 sh -c를/bin/bash -C++로 바꿨다. . 이 명령은 실행되지만 내 질문에 지정된대로 24로 출력됩니다. – silgon

+0

@silgon 예, 지금 당장 문제를 해결하고 있습니다. – VonC

+0

@silgon 명령의 주된 차이점은 bash 세션이라고 생각하므로 지금 당장 대답을 드리겠습니다. 그러나 사용자 지정 이미지를 사용하더라도 tput은 여전히 ​​24를 반환합니다. – VonC

0

sh에 대한 의견은 크게 관련이 없습니다. 해당 부분 (주어진 대답에서 명확하지 않음)은 명령이 실행되는 방식입니다. 다음 순서 tput 검사 세 기능 (setupterm 사용)

  1. terminfo 데이터베이스로부터 상기 단말의 크기 (많은 설명은이 정보를 제공하지 않지만, TERM=xterm, 그것은 80 의해 24 인),
  2. 라인의 실제 수는 운영 체제에서 해당 정보를 얻을 수있는 경우 (즉, 현재 창 크기), 및
  3. LINESCOLUMNS 싸다 멘션 변수.

대화 형 쉘 없이 실행되는 명령은현재 창 크기을 받고 배제하는 방식으로 수행 될 수있다. 예를 들어,이 기능은 ssh (-t 옵션)입니다. 또한 Docker가 LINESCOLUMNS 변수를 설정할 수도 있습니다 (무의미 함에도 불구하고).

동작을 설명하는 데는 (1) 또는 (3)의 경우 모두 충분합니다. 시간 지연과 인종을 소개하는 것은 그렇게하지 않습니다.

+0

나는 내 대답을 udated : https://github.com/opencontainers/runtime-spec/pull/563 모든 플랫폼에 대한 돌볼 것입니다. – VonC

관련 문제