2016-08-05 10 views
9

Ich würde gerne wissen, wie Sie das folgende Verhalten ändern. Nehmen wir an, mein Terminal hat Zeilen. Dann benutze ich die folgenden Befehle:Docker Anzahl der Zeilen im Terminal ändern im Docker

$ 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 

Wie Sie sehen können, selbst wenn alle Ergebnisse sein sollen, wenn ich den Container als docker run --rm -it ubuntu:16.04 tput lines ich nenne es mir immer 24 trotz der Größe meines Terminal gibt . Dies ist nicht nur mit dem Ubuntu-Container, ich habe auch versucht mit Debian (docker run --rm -it debian tput lines) und ich habe das gleiche Ergebnis 24.

Der Zweck ist, die mdp presentation tool verwenden, die die Zeilen in Ihrem Terminal berücksichtigt. Als meine Implementierung fehlschlug, probierte ich eine andere Person docker implementation, aber ich lief auf den gleichen Fehler.

Hier ist mein Fehler in einem Bild:

Docker number of lines in terminal changing inside docker

Hat jemand eine Ahnung, was es sein könnte und wie können diese gelöst werden?

Antwort

5

Die Ubuntu Dockerfile umfasst:

CMD ["/bin/bash"] 

Das bedeutet, den Standard ENTRYPOINT ist sh -c (und ich bezweifle, tput line funktioniert gut in einer sh Sitzung, da tputterminfo Datenbank verwendet, die nur in diesem Bild für bash gesetzt werden könnten)

Sie könnten versuchen, ENTRYPOINT mit bash -c zu überschreiben und überprüfen, ob das besser funktioniert.

, die nicht von der Kommandozeile obwohl funktioniert:

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

Ich werde die Möglichkeit der Definition eines benutzerdefinierten Bild überprüfen. obwohl

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

Das Ergebnis ist das gleiche:

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

Dies ist jedoch "Werke":

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

mit:

[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 

Es könnte ein Synchronisierungsproblem sein, da derselbe Befehl 24 ausgibt von Zeit zu Zeit.

Eigentlich ist die folgende immer return "nicht 24" mit:

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

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

Die OP silgon schlägt in the comments:

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

Als BMitch Kommentare below:

Angesichts des Erfolgs des Schlafes ist mein Verdacht, dass Andockfenster den Container mit dem Befehl running ausspioniert, und einmal den Client an den laufenden Container anhängt. Normalerweise etwas, das Millisekunden dauert.

Das bin ich eine andere Idee haben:

[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 

A tput lines innerhalb einer angeschlossenen Sitzung funktioniert gut.
(Auf den drmae alias finden Sie unter "How to remove old and unused Docker images")


thajeztah fügt in the comments:

der Container erstellt wird, dann mit den Standardeinstellungen (80x24) gestartet, und danach (wenn -it), eine Sitzung ist beigefügt.
Die Sitzung gibt die Größe des Terminals an;

Siehe "Resize a container TTY" API.

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

Weitere Informationen finden Sie unter docker issue 25450.
Es ist verwandt mit issue 10341 "Container create or start should accept height/width params". Aleksa Sarai (cyphar) fügt hinzu (September 2016):

Dies hat tatsächlich wieder in der Runtime-spec taucht (opencontainers/runtime-spec PR 563).
Da Windows die Möglichkeit erfordert, beim erstmaligen Start die Größe der Konsole festzulegen, können wir sie am Ende für alle Plattformen hinzufügen.


Die OP silgon Punkte, um den Code in api/client/container/run.go:

// 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() 
} 

Mit der logischen Frage:

wäre es auch sinnvoll, auf Linux diese Eigenschaft zu verwenden, und setze die anfängliche Konsolengröße mit diesem Wert?

Kenfe-Mickaël Laventure (mlaventure) ist auf, und ein neuer Patch es Docker 1.13 machen könnte.

+0

Ihr Befehl funktioniert nicht (zumindest nicht für mich), wirft es den folgenden Fehler "Docker: Fehler Antwort von Daemon:/bin/bash -c: keine solche Datei oder Verzeichnis", das ist seltsam. Wie auch immer, basierend auf Ihrem Befehl konnte ich 'docker run --rm -it ubuntu: 16.04 bash -c" tput lines "' verwenden, also ändere ich 'sh -c' in'/bin/bash -C++, wie Sie gesagt haben . Dieser Befehl wird ausgeführt, gibt aber auch 24 als Ausgabe aus, die ich in meiner Frage angegeben habe. – silgon

+0

@silgon Ja, ich bin gerade dabei, sie zu beheben – VonC

+0

@silgon Ich lasse diese Antwort für jetzt, da ich denke, der Hauptunterschied zwischen Ihren Befehlen ist die Bash-Sitzung. Aber auch mit einem benutzerdefinierten Image gibt tput immer noch 24 – VonC

0

Die Kommentare über sh gegenüber terminfo sind weitgehend irrelevant. Der relevante Teil (in der gegebenen Antwort nicht klar) ist die Art, wie der Befehl ausgeführt wird. tput prüft drei Funktionen in der folgenden Reihenfolge (mit setupterm):

  1. der Größe des Terminals aus der Datenbank term (viele Beschreibungen geben diese Informationen nicht, aber mit TERM=xterm ist es von ),
  2. die tatsächliche Anzahl der Zeilen, wenn sie diese Informationen aus dem Betriebssystem bekommen (dh die aktuelle Fenstergröße) und
  3. der LINES und COLUMNS environ Variablen.

Ein Befehl, der ohne eine interaktive Shell ausgeführt wird in einer Art und Weise durchgeführt werden könnte, die die aktuelle Fenstergröße verbiete bekommen. Zum Beispiel ist das eine Eigenschaft von ssh (die -t Option). Außerdem wäre es für Docker möglich (obwohl sinnlos), die Variablen LINES und COLUMNS zu setzen.

Entweder Fall (1) oder (3) ist genug, um das Verhalten zu erklären; die Einführung von Zeitverzögerungen und Rennen macht das nicht.

+0

Ich habe meine Antwort udated: https://github.com/opencontainers/runtime-spec/pull/563 kümmert sich darum für alle Plattformen. – VonC

Verwandte Themen