Moby: Die Standardausgabe von "docker ps" ist zu breit

Erstellt am 8. Aug. 2014  ·  83Kommentare  ·  Quelle: moby/moby

screenshot 2014-08-07 16 27 38

Die Ausgabe von docker ps ist auf 80 Zeichen breiten Terminals sehr schwer zu lesen.

/bin/ps macht einen ziemlich guten Job beim Umschließen der Ausgabe auf schmalen Terminals (zB wichtige Informationen zuerst, Befehl zuletzt und abschneiden). Ich frage mich, ob wir es besser machen können.

arecli exbeginner kinenhancement kinfeature

Hilfreichster Kommentar

Was ist falsch an der Leitung zu einem Pager?

docker ps | less -S

Alle 83 Kommentare

So viel Liebe und viele +1. Ich verwende 80x24 Terminals (sehr zum Leidwesen von
meine Kollegen) und dieser hat mich schon seit einiger Zeit gereizt
Zeit.

Ich muss sagen, das erwischt mich auch oft.

Irgendwelche Ideen für eine Lösung? Eine kleinere Version auf schmaleren Terminals zu haben, klingt gut.

Nun, ID muss nicht wirklich da sein.

Wie wäre es damit:

NAME               IMAGE              STATUS      PORTS             COMMAND
prickly_perlman    ubuntu:14.04       Up 15s      8000->8000/tcp    sleep 30000

Erläuterung:

  • keine ID, da Container immer Namen haben
  • nein erstellt, das kannst du nachschauen
  • Es scheint ziemlich nützlich zu sein, eine Übersicht über alle geöffneten Ports zu haben, aber vielleicht könnte dies entfallen?
  • Befehl kann auf die Breite des Terminals gekürzt werden, wie /bin/ps

@bfirsh :thumbsup: mit diesen Anmerkungen;

  • Bitte lassen Sie keine Ports fallen, für mich sind sie sehr nützlich, um schnell zu sehen, welche Ports mit welchem ​​Container verbunden sind. Jeden Container inspizieren zu müssen ist mühsam
  • Was tun mit --no-trunc , da die Container-ID jetzt nicht mehr sichtbar ist? Es gibt viele Beispiele, die sich auf diese Funktion verlassen, um angehaltene Container zu bereinigen
  • Was wird die (Standard-) Sortierreihenfolge sein? Erstellungsdatum (nicht logisch, da diese Spalte nicht mehr sichtbar ist)? Alphabetisch nach Containernamen?
  • Zur zukünftigen Verbesserung; erlauben anzugeben, welche Spalten angezeigt und sortiert werden sollen (zB --columns=a,f,g --sort=a,e
  • Zur zukünftigen Verbesserung; die anzuzeigenden und zu sortierenden Spalten in einer Konfigurationsdatei konfigurierbar machen
  • Zur zukünftigen Verbesserung; Erlaube das Setzen von Standardfilteroptionen (zeige gestoppte Container standardmäßig nicht an ( -a ))

Was ist falsch an der Leitung zu einem Pager?

docker ps | less -S

@benjamin-thomas oder docker ps erkennt ein TTY und leitet standardmäßig an less -S ?

Netter Trick @benjamin-thomas , den werde ich in Zukunft auf jeden Fall anwenden. Eine Überlegung ist, dass Informationen, die mir wichtig sind, ausgelassen werden, vor allem Containernamen. Wobei ich mich in meinem Anwendungsfall normalerweise nicht so sehr auf zB CREATED und STATUS interessiere.

IMO kann der Anwendungsfall von Benutzer zu Benutzer variieren, für mich ist STATUS _ist_ wichtig, um schnell zu überprüfen, ob meine Container noch gut laufen oder ein "Whoopsie" gemacht haben.

Ich bin mir nicht wirklich sicher, ob dies eine große Neuimplementierung der ps-Ausgabe werden soll oder _starten_, indem sie standardmäßig etwas sauberer gemacht und darauf aufgebaut wird, indem sie durch Hinzufügen von Optionen zum Angeben von anzuzeigenden Spalten und Sortierreihenfolge konfigurierbarer gemacht wird und Filterung.

@nathanleclaire , verwenden Sie einfach Ihre Pfeiltasten, sobald Sie sich in less , Sie haben Zugriff auf den gesamten Inhalt. Oder habe ich dich falsch verstanden?

@grahamc warum nicht, persönlich bevorzuge ich Tools, die diese Dinge nicht automatisch tun. Man könnte immer einen Shell-Alias ​​für diese IMO definieren, wenn dies erforderlich ist.

@thaJeztah Die Angabe der Spaltennamen mit Schaltern macht für mich Sinn, wie der System-PS-Befehl /bin/ps -o pid,ruser=RealUser -o comm=Command .

@benjamin-thomas Oh, das war mir noch gar nicht bewusst. Schön! Diese Lösung gefällt mir sehr gut.

@benjamin-thomas /bin/ps macht dies automatisch. Wenn Sie es deaktivieren möchten, können Sie es über cat oder was auch immer weiterleiten.

Bezogen auf die Breite der Ausgabe von docker ps : Ist es wirklich notwendig, jede mögliche Kette von Verknüpfungen zu einem bestimmten Container als neuen Namen für diesen Container zu behandeln? Wenn ich beispielsweise fünf Container mit den Namen A, B, C, D und E habe und A auf B, B auf C usw. verweist, dann hat E fünf verschiedene Namen: E, D/E, C/ D/E, B/C/D/E und A/B/C/D/E.

Wenn B dann auch auf beispielsweise D verweist, bekommt E noch MEHR Namen: B/D/E und A/B/D/E. Ein Lauf des Systems, an dem ich arbeite, startet siebzehn Container – die alle zusammen aufgrund von 31 Abhängigkeitsbeziehungen _dreihundertsiebenundachtzig Namen_ haben. Egal wie breit ich meine Terminalfenster mache, die Ausgabe von docker ps ist ohne Pager nicht lesbar. Ist es wirklich sinnvoll, dass die Anzahl der Namen bei der Anzahl der Container _schlechter als quadratisch_ ist? Es wäre zumindest schön, wenn es eine Möglichkeit gäbe, diese pedantische Aufzählungsebene zu deaktivieren.

@mraccident :+1: docker ps sollte nur den primären Namen anzeigen , nicht alle Namen für diesen Container

Salut, es hat mich auch gestört und ich habe gerade Docker eine '--short'-Option hinzugefügt. die komplette Port-Spalte behalten.
https://github.com/ChristianKniep/docker/tree/7477-short_ps

$ docker run --name fd1 -d -p 80 -p 22 -p 53 fedora sleep 600
af6599f9b1178b237f6c2524f14cada45a46b234168e5270b99b16d1ce0be295
$ docker run --name fd2 --link fd1:fd1  -d -p 80 -p 22 -p 53 fedora sleep 600
ec2b2afc72dae7e62b197dc5adbcdeb548435ac495b8c935c728eb7aff658004
$ docker run --name fd3 --link fd2:fd2  --link fd1:fd1  -d -p 80 -p 22 -p 53 fedora sleep 600
ac57921063cc6afbe1cf715872dc33df45147ef1f464859c0912261b88e6bb4b
$ docker ps
CONTAINER ID        IMAGE                       COMMAND             CREATED             STATUS              PORTS                                                                 NAMES
ac57921063cc        fedora:latest   sleep 600           3 seconds ago       Up 2 seconds        0.0.0.0:49159->22/tcp, 0.0.0.0:49160->53/tcp, 0.0.0.0:49161->80/tcp   fd3                               
ec2b2afc72da        fedora:latest   sleep 600           11 seconds ago      Up 10 seconds       0.0.0.0:49156->22/tcp, 0.0.0.0:49157->53/tcp, 0.0.0.0:49158->80/tcp   fd2,fd3/fd2                       
af6599f9b117        fedora:latest   sleep 600           31 seconds ago      Up 30 seconds       0.0.0.0:49153->22/tcp, 0.0.0.0:49154->53/tcp, 0.0.0.0:49155->80/tcp   fd1,fd2/fd1,fd3/fd1,fd3/fd2/fd1                    
$ ./docker-1.1.2-dev ps -S
CONTAINER ID        IMAGE                       PORTS                                                                 NAMES
ac57921063cc        fedora:latest   0.0.0.0:49159->22/tcp, 0.0.0.0:49160->53/tcp, 0.0.0.0:49161->80/tcp   fd3                               
ec2b2afc72da        fedora:latest   0.0.0.0:49156->22/tcp, 0.0.0.0:49157->53/tcp, 0.0.0.0:49158->80/tcp   fd2,fd3/fd2                       
af6599f9b117        fedora:latest   0.0.0.0:49153->22/tcp, 0.0.0.0:49154->53/tcp, 0.0.0.0:49155->80/tcp   fd1,fd2/fd1,fd3/fd1,fd3/fd2/fd1             
$ ./docker-1.1.2-dev ps -h

Usage: docker ps [OPTIONS]

List containers

  -a, --all=false       Show all containers. Only running containers are shown by default.
  --before=""           Show only container created before Id or Name, include non-running ones.
  -f, --filter=[]       Provide filter values. Valid filters:
                          exited=<int> - containers with exit code of <int>
  -l, --latest=false    Show only the latest created container, include non-running ones.
  -n=-1                 Show n last created containers, include non-running ones.
  --no-trunc=false      Don't truncate output
  -q, --quiet=false     Only display numeric IDs
  -S, --short=false     Skip command created and status
  -s, --size=false      Display sizes
  --since=""            Show only containers created since Id or Name, include non-running ones.
$

Da ich ein Neuling bin, denke ich, dass mein Code ... optimiert ...
Aber erstaunlich, wie einfach es ist, den Code als langjähriger Python-Typ zu ändern. Ich mag das!

EDIT: Vielleicht könnte man die Größe des Terminals abrufen und Spalten rausschmeißen, um die Zeilen zu verkürzen ...

EDIT2: Ich habe die NAMEN gekürzt und eine Zählung (KINDER) hinzugefügt, auch wenn es etwas irreführend ist, da es auch fd3->fd2->fd1 zählt.

$ ~/bin/docker-1.1.2-dev ps -S
CONTAINER ID        IMAGE                       PORTS                                                                 NAME                #CHILDREN
9b382826657c        fedora:latest   0.0.0.0:49168->22/tcp, 0.0.0.0:49169->53/tcp, 0.0.0.0:49170->80/tcp   fd3                 0
93f5a7b13d8b        fedora:latest   0.0.0.0:49165->22/tcp, 0.0.0.0:49166->53/tcp, 0.0.0.0:49167->80/tcp   fd2                 1
4c6f3564612c        fedora:latest   0.0.0.0:49162->80/tcp, 0.0.0.0:49163->22/tcp, 0.0.0.0:49164->53/tcp   fd1                 3

EDIT3: Jetzt extrahiere ich den richtigen Namen

$ ./docker-1.1.2-dev ps -S
CONTAINER ID        IMAGE                       PORTS                                                                 NAME                #LINKS
71d9d03bba50        fedora:latest   0.0.0.0:49177->22/tcp, 0.0.0.0:49178->53/tcp, 0.0.0.0:49179->80/tcp   fd3                 0
cf67008f418f        fedora:latest   0.0.0.0:49174->22/tcp, 0.0.0.0:49175->53/tcp, 0.0.0.0:49176->80/tcp   fd2                 1
5549c65007b5        fedora:latest   0.0.0.0:49171->22/tcp, 0.0.0.0:49172->53/tcp, 0.0.0.0:49173->80/tcp   fd1                 3

Ich glaube, dass die Port-Definition und die Ausführlichkeit der Zeit einen großen Teil der Breite der Ausgabe von docker ps ausmachen. Ich denke, das Kürzen der Zeiten und das Umbrechen der Portdefinitionen über Zeilen würde viel Platz sparen (zusätzlich dazu, dass ich Spalten auswählen/ausblenden kann).

CONTAINER ID     IMAGE                 COMMAND                CREATED     STATUS              PORTS                            NAMES
8a2e6a22ae1f     me/abc-data:latest    "/bin/sh -c bash"      6 sec       Exited (0) 6 sec                                     app-without-ports
749ed051fb73     me/webserver:latest   "/opt/server/run.sh"   4 days      Up 4 days           0.0.0.0:8080->8080/tcp,          my-webserver
                                                                                              192.168.1.1:9990->9990/tcp      
2eb3c43af24f     me/app:latest         "/opt/container-star   8 days      Up 8 days           0.0.0.0:1234->1234/tcp,          some-other-app
                                                                                              0.0.0.0:4567->4567/tcp, 
                                                                                              0.0.0.0:50000->50000/tcp, 
                                                                                              0.0.0.0:50000->50000/udp  

Wie wäre es, wenn Sie beispielsweise erlauben, eine Vorlage bereitzustellen, indem Sie eine Umgebungsvariable DOCKER_PS_FORMAT mit columname:width :modifier, columname:width :modifier, ...
wobei modifier zusätzliche Einstellungen wie no-trunc , full (zum Beispiel für Container-ID) oder short für CREATED zulassen könnte, wobei ~1h könnte eine Kurzform für About an hour ago .

Ich habe diese bash/zsh-Funktion in meinem ~/.bashrc , um die Ausgabe von docker ps besser anzuzeigen. Sie können die Spalten ausblenden oder neu anordnen:

dps()  {
  docker ps $@ | awk '
  NR==1{
    FIRSTLINEWIDTH=length($0)
    IDPOS=index($0,"CONTAINER ID");
    IMAGEPOS=index($0,"IMAGE");
    COMMANDPOS=index($0,"COMMAND");
    CREATEDPOS=index($0,"CREATED");
    STATUSPOS=index($0,"STATUS");
    PORTSPOS=index($0,"PORTS");
    NAMESPOS=index($0,"NAMES");
    UPDATECOL();
  }
  function UPDATECOL () {
    ID=substr($0,IDPOS,IMAGEPOS-IDPOS-1);
    IMAGE=substr($0,IMAGEPOS,COMMANDPOS-IMAGEPOS-1);
    COMMAND=substr($0,COMMANDPOS,CREATEDPOS-COMMANDPOS-1);
    CREATED=substr($0,CREATEDPOS,STATUSPOS-CREATEDPOS-1);
    STATUS=substr($0,STATUSPOS,PORTSPOS-STATUSPOS-1);
    PORTS=substr($0,PORTSPOS,NAMESPOS-PORTSPOS-1);
    NAMES=substr($0, NAMESPOS);
  }
  function PRINT () {
    print ID NAMES IMAGE STATUS CREATED COMMAND PORTS;
  }
  NR==2{
    NAMES=sprintf("%s%*s",NAMES,length($0)-FIRSTLINEWIDTH,"");
    PRINT();
  }
  NR>1{
    UPDATECOL();
    PRINT();
  }' | less -FSX;
}
dpsa() { dps -a $@; }

Problemumgehungs-Hack. Ändern Sie wie gewünscht, welche $cols[x] Sie behalten möchten.

docker ps | perl -ne '<strong i="6">@cols</strong> = split /\s{2,}/, $_; printf "%30s %20s %20s\n", $cols[1], $cols[3], $cols[4]'

Wäre es nicht einfacher, so etwas zu haben:

$ docker ps --columns=name,id,status,image

und jeder könnte einfach docker ps .

Danke, @caiguanhao. Clevere Zwischenlösung. Es wurde als Tackle-Plugin für die Fischmuschel hinzugefügt.

Leute , @caiguanhao vorgenommen , um auswählen zu können, welche Spalten

https://github.com/jpmelos/dotfiles/commit/457a9c68f87eb5bd455aa22bdadab81c2651c2ea

Eine einfache Änderung, die ein wenig helfen würde, besteht darin, den Abstand zwischen den Spalten CONTAINER ID und IMAGE zu verringern. Die anderen Spalten sind alle durch 3 Leerzeichen getrennt, aber diese beiden sind durch 8 getrennt.

Meine 5 Cent, bis sie 'Docker ps' lesbar machen:

https://github.com/t0mk/dosk#dops

Werden wir dazu ein Update sehen?
docker ps ist meiner Meinung nach der gebräuchlichste Befehl. Ich hoffe, es ist nicht so schwer, uns die Option zum Filtern von anzuzeigenden Spalten zu geben.
(Ich würde so etwas wie zu erwarten , dass )

dibs

Wie @AntouanK sagte und @wpp bereits vorgeschlagen hat, wird ein Spalten-Flag für die meisten Situationen bevorzugt

Ich denke, #10255 sollte dies ansprechen.

@duglin Macht dies die Standardeinstellung jedoch kürzer? Ich würde das gerne offen lassen, wenn nicht.

@bfirsh guter Punkt, nein, es würde die Standardeinstellung nicht ändern. Aber ich bin mir nicht sicher, ob wir den Standard bis v2 ändern können (wenn / wann das ist), da wir sonst bestehende Clients zerstören würden.

Ich auch. vielleicht ein intelligenter Mechanismus, der die angezeigten Standardspalten auswählt, indem Schwellenwerte auf ENV['COLUMNS'] angewendet werden?

Ich stimme https://github.com/docker/docker/issues/7477#issuecomment -70243594 zu, geben Sie uns einfach die Möglichkeit, die Spalten auszuwählen.

Ich stimme auch für die Option https://github.com/docker/docker/issues/7477#issuecomment -70243594.
docker ps wäre docker ps --columns=id,image,command,created,status,ports,name und es könnte leicht sein, weitere Spalten wie ip zu implementieren, wie einige Benutzer es wollten https://github.com/docker/docker/issues/8786

+1 für --Spalten

Als Workaround kombiniere ich docker ps -q mit docker inspect --format :

docker ps -q | xargs docker inspect --format '{{printf "%.12s\t%s" .Id .Config.Cmd}}'

Sie müssen in die Ausgabe von Docker Inspect und Golang-Templating eintauchen, aber es ist fast unendlich konfigurierbar.

@jafcrocker Schön. Vielleicht können wir eine öffentliche Zusammenfassung erstellen, um eine Sammlung von Problemumgehungen wie diese hier zu speichern? Bis wir einige Flags haben, um die Ausgabe richtig anzupassen...

Wir haben gerade #14699 zusammengeführt, mit dem Sie docker ps --format ... ausführen können, um die ps-Ausgabe zu ändern. Sie können auch ein Standardformat festlegen, wenn Sie möchten, sehen Sie sich diesen Screenshot an:

image

Ich werde dieses Problem als behoben schließen. Bitte probieren Sie es aus und teilen Sie uns Ihre Meinung mit.

Für diejenigen, die es ausprobieren möchten, finden Sie "Master"-Builds unter https://master.dockerproject.org und diese Funktion sollte bald verfügbar sein (wenn nicht bereits).

Obwohl das --format eine wirklich nette Ergänzung ist, denke ich nicht, dass dies das Hauptproblem löst. Fast alle Befehlszeilentools, die ich täglich verwende, verarbeiten Terminals mit variabler Größe ordnungsgemäß. Meistens, indem Sie sich die Umgebungsvariable $COLUMNS ansehen und den entsprechenden Text anzeigen.

Beispiel: ps aux in einem 80x24-Terminal:
screenshot from 2015-07-23 00 47 35

Und in einem 137x24-Terminal:
screenshot from 2015-07-23 00 49 35

Es ändert die Spaltenbreite und verkürzt den Befehl, sodass alles gut in eine Zeile passt. Alles für die Lesbarkeit und für einen Menschen leicht zu analysieren.

Sicher, ich kann einen Bash-Wrapper schreiben, der je nach $COLUMNS unterschiedliche Formatierungsoptionen anwendet, aber es hört sich wirklich hackig an und sollte meiner Meinung nach Standardverhalten für jedes Befehlszeilenprogramm sein. Es tut mir leid zu sagen, dass die Ausgabe von Docker unordentlich und schwer zu lesen ist.

Gibt es einen Grund, warum dies nicht getan wird? Irgendeine Einschränkung in einer Bibliothek oder eine Entscheidung Ihrerseits? Ich muss wissen, ob es sich lohnt, dies in einer PR zu beheben, oder ob ich vielleicht den falschen Baum belle.

@nsg : Einverstanden - die Standardausgabe könnte noch verbessert werden.

Gab es zu diesem Thema ein Update?

Aus welchem ​​Grund auch immer, Bild-Hashes werden in der ps-Ausgabe nicht mehr abgeschnitten. Ich musste mein Terminal schon in der Vergangenheit ultrabreit machen (den ganzen Bildschirm einnehmen), nur um Docker nutzbar zu machen, jetzt reicht das nicht mehr. Ab 1.7.1 ist jede Zeile etwa 200 Spalten breit. Wer nutzt ein so breites Terminal?

Ich habe ein bisschen damit herumgespielt.

Das Entfernen von ID und erstellt führt uns ein wenig dorthin:

NAMES                 IMAGE          STATUS                     PORTS                         COMMAND
elegant_turing        nginx          Up 13 secs                 0.0.0.0:80->80/tcp, 443/tcp   "nginx -g 'daemon off"
composedemo_web_1     composedemo_   Exited (2) 23 secs ago                                   "/bin/sh -c 'python a"
composedemo_redis_1   redis          Exited (137) 11 secs ago                                 "/entrypoint.sh redis"
elated_carson         hello-world    Exited (0) 23 mins ago                                   "/hello"

Allerdings noch zu lang. Wir könnten 0.0.0.0 ignorieren:

NAMES                 IMAGE          STATUS                     PORTS                 COMMAND
elegant_turing        nginx          Up 13 secs                 80->80/tcp, 443/tcp   "nginx -g 'daemon off"
composedemo_web_1     composedemo_   Exited (2) 23 secs ago                           "/bin/sh -c 'python a"
composedemo_redis_1   redis          Exited (137) 11 secs ago                         "/entrypoint.sh redis"
elated_carson         hello-world    Exited (0) 23 mins ago                           "/hello"

Aber noch etwas lang. Vielleicht ist etwas Kreativität erforderlich, um den Status zu verkürzen... etwas parsbares/scanbares, aber immer noch kurzes... Exit (2) 23s ago vielleicht?

Obwohl der Befehl gekürzt werden kann, müssen wir auch alles andere kürzen, um sicherzustellen, dass mindestens _einige_ des Befehls angezeigt wird. Kann den Namen nicht kürzen. Das Bild könnte möglicherweise ein "..." erhalten, wenn es abgeschnitten ist. Gleiches gilt für lange Ports.

Die Gedanken?

Einige Hacks sind hier: https://github.com/docker/docker/compare/master...bfirsh :7477-shorter-ps

@bfirsh Ich denke, du bist auf der

Wenn Sie den Status (wie Sie sagten) auf 23 statt auf 23 Sekunden ändern und sowohl die Bild- als auch die Port-Spalte abschneiden, sollte sie kurz genug sein.

@bfirsh Sie beginnen in der Standardansicht zu arbeiten? Denken Sie über die Option --format manche Leute sprechen?

Außerdem könnten wir s anstelle von sec und m anstelle von mins

@aanm wir haben bereits die --format in Docker 1.8. Sie können auch das Standardverhalten von ps in der Client-Konfigurationsdatei ändern, indem Sie Folgendes hinzufügen:

{
  "psFormat": "table {{ .ID }}\\t{{ .Status }}"
}

Sie können Ihre Standardeinstellung mit dem Format festlegen, das Ihnen besser gefällt.

Ich muss oft den aktuellen Containernamen sehen, um als nächstes docker exec auszuführen, um es anzuhängen.

Also, ich hoffe, wenn ich NAMES nach IMAGE , wird es gut, ich brauche keine Konfiguration mehr.

Danke.

Problem in Docker 1.8.1 (fc21)
--format kennt keine Containernamen.

docker ps --format "{{.ID}}t{{.Image}}t{{.CreatedAt}}t{{.RunningFor}}t{{.Status}}t{{.Name}}" -a
Vorlagen-Parsing-Fehler: Vorlage: :1:64: Ausführen von "" bei <.Name>: Name ist kein Feld vom Strukturtyp *ps.containerContext

Bisher verwendet:
docker ps -a | perl -ne 'chomp; @cols = split /s{2,}/, $_; $name=pop @cols; printf "%-28s %-20s %-20s %-30sn", $name, $cols[1], $cols[3], $cols[4]'

danke an @caiguanhao für die Inspiration.

ich lasse das einfach hier:

IMAGE                                NAMES                     STATUS              PORTS
xxxxx:x.x                            xx_xxxxxxxx_xxxxx         Up About an hour    10.23.123.111:26002->6379/tcp
xxxxxxxxx:x.x                        xx_xxxxxxxx_xxxxxxxxx     Up About an hour    29015/tcp
                                                                                   10.23.123.111:26001->8080/tcp
                                                                                   10.23.123.111:26000->28015/tcp
xxxxxxxx_xx_xxxxxxxx                 xx_xxxxxxxx               Up About an hour    127.0.0.1:8086->8080/tcp
xxxxxx_xx                            xx_xxx_xxx                Up About an hour    127.0.0.1:8082->8888/tcp
xxx_xx                               xx_xxx                    Up About an hour    127.0.0.1:8083->8080/tcp
xxxx/xxxxxxxxx-xxxxxx                xx_xxx_xxxxxxxxx_xxx      Up 2 hours          10.23.123.111:25002->25565/tcp
xxxx/xxxxxxxxx-xxxxxx                xx_xxx_xxxxxxxxx_xxxxxx   Up 2 hours          10.23.123.111:25001->25565/tcp
xxxxxx/xxxxxxxx:xxxxxx               xxx_xxxxxxxx              Up 3 hours          127.0.0.1:8080->8080/tcp
xxxxxxxxxx/xxxxxxx                   xxx_xxxxxxx               Up 3 hours          10.23.123.111:25->25/tcp
                                                                                   10.23.123.111:587->587/tcp
xx_xxx                               xx_xx                     Up 3 hours          10.23.123.112:9987->9987/tcp
                                                                                   10.23.123.112:10011->10011/tcp
                                                                                   10.23.123.112:30033->30033/tcp
                                                                                   10.23.123.112:9987->9987/udp
xxxx.xx/xxxxxxxxx/xxxxxx:x.x.x       xxx_xxxxxx                Up 3 hours          10.42.241.123:22->22/tcp
                                                                                   443/tcp
                                                                                   127.0.0.1:8000->80/tcp
xxxxxx/xxxxxx-xxxxxx:xxxxxx          xxx_xxxxxx_xx_xxxxxx      Up 3 hours
xxxx.xx/xxxxxxxxx/xxxxxxxxxx:x.x-x   xxx_xxxxxx_xxxxxxxx       Up 3 hours          5432/tcp
xxxx.xx/xxxxxxxxx/xxxxx:xxxxxx       xxx_xxxxxx_xxxxx          Up 3 hours          6379/tcp

/etc/profile.d/dps.sh: https://gist.github.com/GottZ/4a6c2af314d73cd8b71d

Schön @GottZ , danke fürs Teilen!

@thaJeztah Ich habe gerade jede gerade Linie fett gewährleisten . viel spaß :lächeln:

Inzwischen mein Ansatz mit awk :

$ alias my_docker_ps="docker ps | awk 'BEGIN{FIELDWIDTHS = \"20 33 23 20 20 70 20\"}{print \$1,\$2,\$5,\$7}'"

$ my_docker_ps         
CONTAINER ID         IMAGE                             STATUS               NAMES
b83fe9a6a06e         kibana                            Up 32 minutes        kibana              
4d78b9cd2bed         elasticsearch                     Up About an hour     evil_feynman        
fbbc40a49569         mattermost/platform               Up 9 weeks           mattermost-dev      
3b4dd9d00305         outcoldman/splunk:latest          Up 9 weeks           boring_yalow           

@danidelvalle warum nicht einfach;

docker ps --format "table {{.ID}}\t{{.Image}}\t{{.Status}}\t{{.Names}}"

Dieser wurde bereits festgeschrieben und freigegeben. Ich verstehe nicht, warum ist das noch offen?

@thaJeztah du hast recht, danke :)

@ovidiub13 hauptsächlich wegen https://github.com/docker/docker/issues/7477#issuecomment -123898874

ja das ist nervig..

Normalerweise kann ich nur das Standard-PS an der Breite der Terminalspalten abschneiden:

dps() {
  docker ps | cut -c-$(tput cols)
}

+1 für --columns=name,id,status,image

Dieses Problem besteht leider immer noch. Wie auch immer, eine Problemumgehung besteht darin, Folgendes (in Ubuntu getestet) in Ihr .bashrc :

CMD_WATCHDOCKER="watch \"docker ps -q | xargs docker inspect --format '{{.Id}} @{{.Config.Image}} @{{.Config.Cmd}} @{{range \\\$p, \\\$conf := .NetworkSettings.Ports}}{{\\\$p}}->{{(index \\\$conf 0).HostPort}}{{end}} @{{.NetworkSettings.IPAddress}}' | column -t -s='@' | cut -c 1-5,64-\""
alias watchdocker='eval $CMD_WATCHDOCKER'

Das Laufen von watchdocker gibt:

4596c3   ruby:2.2.2   [bash]                        172.17.0.82
827ca9   postgres     [postgres]   5432/tcp->5432   172.17.0.72

@Pithikos docker ps--format '{{ .ID }}\t{{ .Image }}\t{{ .Command }}\t{{ .Ports }}' gibt Ihnen dies, ohne all diese API-Aufrufe für jeden Container durchzuführen .
Sie können dies auch in ~/.docker/config.json , um es zum Standardformat zu machen

@cpuguy83 welche Version unterstützt das? Ich habe es nie geschafft, das zum Laufen zu bringen, weder bei der Arbeit noch zu Hause. Wäre cool, wenn in der Dokumentation erwähnt würde, welche Version was unterstützt.

@Pithikos Entweder 1,8 oder 1,9, nicht sicher.

dibs

Die korrekte Verwendung ist mit dem Schlüsselwort "table" in der Formatzeichenfolge, dies gibt Ihnen eine schöne Formatierung docker ps -a --format="table {{.ID}}\t{{.Names}}\t{{.Image}}\t{{.Command}}\t{{.Status}}" Abstand

Ich schließe diesen, da es den Anschein hat, dass das --format Flag für ps das Problem behebt. Danke an alle!

Dieses Problem war vielleicht nicht gut benannt. Es bleibt weiterhin, dass der _default_ für Befehle 80 Zeichen breit sein sollte. Ich bin froh, dass dies geschlossen ist, weil es nicht so wichtig ist.

Wie wäre es mit einer Option zum Hinzufügen einer vertikalen Ergebnisanzeige, wie select * from foobar\G in MySQL?

Normalerweise möchte ich nur wissen, welche Container laufen (und wie lange).

Das funktioniert bei mir:

$ docker ps --format "table {{.Names}}\t{{.Status}}"

Noch besser, ich habe es in einen wirklich leicht zu merkenden Alias ​​verpackt:

alias dps='docker ps --format "table {{.Names}}\t{{.Status}}"'

Hier ist ein Beispiel für die Ausgabe:

NAMES                     STATUS
projectxyz_chrome_1       Up 11 minutes
projectxyz_web_1          Up 11 minutes
projectxyz_app_1          Up 11 minutes
projectxyz_phpmyadmin_1   Up 11 minutes
projectxyz_memcached_1    Up 11 minutes
projectxyz_db_1           Up 11 minutes

Hier erfahren Sie mehr über den Befehl --format :
https://docs.docker.com/engine/reference/commandline/ps/

Hoffe es hilft jemandem 😃

@joshmedeski Sie können Ihre bevorzugte Formatierung auch in einer Konfigurationsdatei speichern, damit sie als Standard verwendet wird; https://docs.docker.com/engine/reference/commandline/cli/#/configuration -files

Im Sinne des Sparens von Tastenanschlägen ist hier das kleine Bash-Skript, das ich geschrieben habe, um eine Liste von Argumenten zu erstellen, den go-Template-String zu erstellen und den docker ps-Befehl auszuführen, um sofort alle gewünschten Spalten in beliebiger Reihenfolge anzuzeigen. Das Einfügen der Konfiguration in eine Datei ist nicht dynamisch genug - ich finde, dass es ziemlich nützlich ist, einen Satz von Spalten in einem Moment und einen anderen Satz einen Moment später zu haben. Das Skript ist hier , hoffe es ist für jemanden nützlich. Prost -andy

#!/usr/bin/env python2
# -*- coding: utf-8 -*-

import subprocess

show_all = False
fields = [
  "Names",
  "Command",
  "Image",
  "CreatedAt",
  "Status",
]

cmd = ['docker', 'ps']
if show_all:
  cmd += ['-a']
cmd += ['--format', '\t'.join([('{{ .'+field+' }}') for field in fields])]
response = subprocess.check_output(cmd)

dataset = [fields]
dataset_widths = [0] * len(fields)
for idx, line in enumerate(response.split('\n')[:-1]):
  fieldvalues = line.decode('utf-8').replace(u"\u2026", u"_").split('\t')
  dataset.append(fieldvalues)
  for jdx, fieldvalue in enumerate(fieldvalues):
    if dataset_widths[jdx] < len(fieldvalue):
      dataset_widths[jdx] = len(fieldvalue)

for idx, items in enumerate(dataset):
  output_line = ['{:>3d}'.format(idx)]
  for jdx, item in enumerate(items):
    output_line.append(('{:'+str(dataset_widths[jdx])+'s}').format(item))
  print '   '.join(output_line)

füge dies in deine ~/.docker/config.json ein
{ "psFormat": "table {{.Names}}\\t{{.Image}}\\t{{.RunningFor}} ago\\t{{.Status}}\\t{{.Command}}", "imagesFormat": "table {{.Repository}}\\t{{.Tag}}\\t{{.ID}}\\t{{.Size}}" }

Und nach Belieben modifizieren. Für mich war das Problem immer ein langer Bildname (da er meinen persönlichen Repository-Namen für meine benutzerdefinierten Bilder enthielt)

Jeder, der nach einem besseren Docker PS sucht, sollte dies überprüfen:
https://github.com/moncho/dry

Problemumgehungs-Hack. Ändern Sie wie gewünscht, welche $cols[x] Sie behalten möchten.

docker ps | perl -ne '<strong i="7">@cols</strong> = split /\s{2,}/, $_; printf "%30s %20s %20s\n", $cols[1], $cols[3], $cols[4]'

Danke.

Das war alles was ich brauchte:
docker ps | perl -ne '<strong i="12">@cols</strong> = split /\s{2,}/, $_; printf "%30s %20s %20s", $cols[1], $cols[4], $cols[6]'

BILDSTATUSNAMEN vergeben
in gut ausgerichteten Spalten

BEARBEITEN

es ist besser, einen Bash-Alias ​​mit etwas wie diesem zu erstellen:

docker ps --format="table {{.Image}}\t{{.Status}}\t{{.Ports}}\t{{.Names}}"

Beachten Sie das "Tabellen"-Format

Problemumgehungs-Hack. Ändern Sie wie gewünscht, welche $cols[x] Sie behalten möchten.

docker ps | perl -ne '<strong i="7">@cols</strong> = split /\s{2,}/, $_; printf "%30s %20s %20s\n", $cols[1], $cols[3], $cols[4]'

Das ist toll, danke

@nagracks Wenn Sie dieses Format als Standard verwenden möchten, empfehle ich die Verwendung des --format Ansatzes (der in Ihrer ~/.docker/config.json Konfigurationsdatei gespeichert werden kann).

Wenn ich meine .docker/config.json Datei mit etwas benutzerdefiniertem wie folgt ändere:

"imagesFormat": "table {{.ID}}  {{.Repository}}\t{{.Tag}}  {{.CreatedSince}}  {{.Size}}",
"psFormat": "table {{.ID}}  {{.Names}}\t{{.Image}}  {{.Command}}  {{.Status}}",

Wie kann ich dann den Befehl docker ps , um das Standardformat anzuzeigen? Ich habe es mit docker ps --format "" versucht, aber es hat immer noch die config.

Die Verwendung von docker ps --format=table sollte das Standardtabellenformat ergeben

Ich würde mich sehr freuen, wenn standardmäßig eine weniger ausführliche Version der Ausgabe verfügbar wäre, ohne sich an die Tabellenformatierungssyntax oder die Variablennamen im Formatierungskontext erinnern zu müssen. Selbst wenn der Standard so beibehalten würde, wie er ist, wäre ein Flag für eine _vorformatierte_ weniger ausführliche Version nützlich.

Welche Informationen von einer weniger ausführlichen Version reduziert werden könnten, hier sind meine zwei Cent:

  • Name und ID dienen für die meisten Verwendungszwecke demselben Zweck, und ein solcher könnte eliminiert werden.
  • Datum und Uhrzeit der Erstellung ist wahrscheinlich etwas, das Sie in der weniger ausführlichen Ausgabe weglassen würden
  • Ich persönlich würde auch gerne Ports aus der weniger ausführlichen Ausgabe weglassen

In meinem Anwendungsfall möchte ich normalerweise nur den Namen des Containers nachschlagen, für den ich andere Befehle ausführen werde (z. B. auf einem Remote-Serverknoten), und wenn die Ausgabe über mehrere Zeilen gewickelt wird, ist es schwierig, die genauer Name des Containers, der mich interessiert.

Ich bin etwas enttäuscht, dass die "genehmigte" Lösung hier "einfach einen Alias ​​mit dem Parameter --format konfigurieren" lautet, als ob Sie diese Befehle immer in Umgebungen ausführen würden, in denen Sie Ihren Alias ​​definiert haben, oder sich an die Formatierungssyntax und die Kontextvariablen erinnern

Ich stoße immer noch täglich auf dieses Problem, FWIW. Meine aktuelle Ausgabe von docker ps -a ist _180 Zeichen breit_ – mehr als die Hälfte meines 27" 4K-Bildschirms!

CONTAINER ID        IMAGE                                          COMMAND                 CREATED             STATUS                    PORTS               NAMES
994be99dddd1        nvidia/cuda:10.2-devel-ubuntu18.04             "bash"                  4 days ago          Exited (0) 4 days ago                         eager_tesla
30796cc3db32        nvidia/cuda:10.2-devel-ubuntu18.04             "bash"                  4 days ago          Exited (127) 4 days ago                       laughing_maxwell
ed5f20c1cff3        gcr.io/deeplearning-platform-release/tf2-gpu   "/entrypoint.sh bash"   4 days ago          Exited (0) 3 days ago                         distracted_ardinghelli
0bb06e992ef4        gcr.io/deeplearning-platform-release/tf2-gpu   "/entrypoint.sh bash"   4 days ago          Exited (0) 4 days ago                         bold_brahmagupta

Vom durchschnittlichen Benutzer sollte nicht erwartet werden, dass er seinen docker ps Befehl mit einem Alias ​​bezeichnet, nur um ihn auf einem Terminal mit angemessener Größe lesbar zu machen. Es muss vielleicht nicht so klein wie 80 Zeichen sein, aber es sollte auf keinen Fall 180 Zeichen lang sein.

Ich bin versucht, als Strohmann einen Pull-Request zu eröffnen. 😏.

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen