Moby: Вывод по умолчанию «docker ps» слишком широк

Созданный на 8 авг. 2014  ·  83Комментарии  ·  Источник: moby/moby

screenshot 2014-08-07 16 27 38

Вывод из docker ps очень трудно прочитать на терминалах шириной 80 символов.

/bin/ps неплохо справляется с обтеканием вывода на узких терминалах (например, важная информация помещается первой, команда последней и обрезается). Интересно, можем ли мы сделать лучше.

arecli exbeginner kinenhancement kinfeature

Самый полезный комментарий

Что не так с конвейером на пейджер?

docker ps | less -S

Все 83 Комментарий

Столько любви и много +1. Я использую терминалы 80x24 (к большому огорчению
мои коллеги), и это было незначительным раздражителем для меня в течение довольно долгого времени.
время.

Я должен сказать, что это часто получает меня также.

Любые идеи для решения? Наличие уменьшенной версии на более узких терминалах звучит неплохо.

Ну, удостоверение личности не обязательно должно быть там.

Как насчет этого:

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

Объяснение:

  • нет идентификатора, потому что у контейнеров всегда есть имена
  • не создано, вы можете проверить это
  • кажется довольно полезным знать обзор всех открытых портов, но, может быть, от этого можно отказаться?
  • команда может быть усечена до ширины терминала, например /bin/ps

@bfirsh :thumbsup: с этими примечаниями;

  • Пожалуйста, не сбрасывайте порты, мне они очень пригодятся, чтобы быстро увидеть, какие порты подключены к какому контейнеру. Необходимость проверять каждый контейнер обременительна
  • Что делать с --no-trunc , теперь этот идентификатор контейнера больше не виден? Существует множество примеров, которые полагаются на эту функцию для очистки остановленных контейнеров.
  • Каков будет порядок сортировки (по умолчанию)? Дата создания (не логично, так как этот столбец больше не виден)? По алфавиту имени контейнера?
  • Для будущего улучшения; разрешить указывать столбцы для отображения и сортировки (например, --columns=a,f,g --sort=a,e
  • Для будущего улучшения; сделать столбцы для отображения и сортировки настраиваемыми в файле конфигурации
  • Для будущего улучшения; разрешить установку параметров фильтра по умолчанию (делать/не показывать остановленные контейнеры по умолчанию ( -a ))

Что не так с конвейером на пейджер?

docker ps | less -S

@benjamin-thomas или docker ps обнаруживают TTY и по умолчанию перенаправляют на less -S ?

Хороший трюк @benjamin-thomas, я обязательно воспользуюсь им в будущем. Одно из соображений заключается в том, что мне не нужна информация, которая мне важна, и самое главное, имена контейнеров. В то время как в моем случае меня обычно не волнуют, например, CREATED и STATUS .

IMO, вариант использования может различаться среди пользователей, для меня STATUS _важно, чтобы быстро проверить, хорошо ли работают мои контейнеры или сделали ли они «упс».

Я не совсем уверен, должно ли это стать большой повторной реализацией вывода ps или _start_ сделать его немного чище по умолчанию и, опираясь на это, сделать его более настраиваемым, добавив параметры для указания столбцов для отображения, порядок сортировки и фильтрация.

@nathanleclaire , просто используйте клавиши со стрелками, как только вы окажетесь внутри less , у вас будет доступ ко всему контенту. Или я вас неправильно понял?

@grahamc, почему бы и нет, лично я предпочитаю, чтобы инструменты не делали эти вещи автоматически. Всегда можно определить псевдоним оболочки для этой IMO, если это необходимо.

@thaJeztah указание имен столбцов с помощью переключателей имеет для меня смысл, например, системная команда ps /bin/ps -o pid,ruser=RealUser -o comm=Command .

@benjamin-thomas О, я даже не понял этого. Хороший! Мне очень нравится это решение.

@benjamin-thomas /bin/ps делает это автоматически. Если вы хотите отключить его, вы можете передать его через cat или что-то еще.

Относительно ширины вывода docker ps : действительно ли необходимо рассматривать каждую возможную цепочку связей с данным контейнером как новое имя для этого контейнера? Например, если у меня есть пять контейнеров с именами A, B, C, D и E, и A ссылается на B, B ссылается на C и т. д., то E будет иметь пять разных имен: E, D/E, C/. D/E, B/C/D/E и A/B/C/D/E.

Затем, если B также ссылается, скажем, на D, E получает еще БОЛЬШЕ имен: B/D/E и A/B/D/E. Один запуск системы, над которой я работаю, запускает семнадцать контейнеров, которые вместе, благодаря 31 взаимосвязи зависимости, имеют _триста восемьдесят семь имен_. Независимо от того, насколько широко я делаю окна терминала, вывод docker ps нечитаем без пейджера. Действительно ли имеет смысл, чтобы количество имен было _хуже квадратичного_ по количеству контейнеров? Было бы по крайней мере неплохо, если бы был способ отключить этот педантичный уровень перечисления.

@mraccident : +1: docker ps должно показывать только основное имя, а не все имена для этого контейнера

Привет, меня это тоже беспокоило, и я просто добавил опцию «--short» в докер. сохраняя полную колонку портов.
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.
$

Поскольку я новичок, я думаю, мой код можно было бы... оптимизировать...
Но удивительно, как легко изменить код, если ты уже целый год питонишь. Мне это нравится!

РЕДАКТИРОВАТЬ: Возможно, можно было бы получить размер терминала и выбить столбцы, чтобы сократить строки...

РЕДАКТИРОВАТЬ2: я сокращаю ИМЕНА и добавляю счетчик (ДЕТИ), хотя это немного вводит в заблуждение, потому что он также считает fd3->fd2->fd1.

$ ~/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: теперь я извлекаю правильное имя

$ ./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

Я чувствую, что определение портов и многословность времени составляют большую часть ширины вывода docker ps . Я думаю, что сокращение времени и перенос определений портов по строкам сэкономит много места (помимо возможности выбирать/скрывать столбцы).

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  

Как насчет предоставления шаблона, например, путем установки переменной среды DOCKER_PS_FORMAT с именем столбца: ширина : модификатор, имя столбца: ширина : модификатор,...
где modifier может разрешить дополнительные настройки, такие как no-trunc , full (например, для идентификатора контейнера) или short для CREATED где ~1h может быть сокращенной формой для About an hour ago .

Я написал эту функцию bash/zsh в моем ~/.bashrc чтобы лучше отображать вывод docker ps , вы можете скрыть или изменить порядок столбцов:

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 $@; }

Обходной хак. Измените, какие $cols[x] вы хотите сохранить по желанию.

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

Не было бы проще иметь что-то вроде:

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

и каждый мог просто использовать псевдоним docker ps .

Спасибо, @caiguanhao. Умное временное решение. Добавил его как плагин Tackle для рыбной раковины.

Ребята, только что внесли небольшое улучшение в код @caiguanhao , чтобы иметь возможность выбирать, какие столбцы отображать. Когда у вас есть контейнер, который предоставляет много портов (например, служба Consul, которая предоставляет 5 или 6 портов и может вызвать переполнение экрана даже на 300 символов), хорошо иметь команду для отображения всех столбцов, кроме этих портов, и затем еще один, который показывает только имя контейнера и его порты (я добавил эти параметры как новые команды по умолчанию):

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

Одно простое изменение, которое может немного помочь, — уменьшить интервал между столбцами CONTAINER ID и IMAGE. Все остальные столбцы разделены 3 пробелами, а эти два — 8.

Мои 5 центов, пока они не сделают "docker ps" читаемым:

https://github.com/t0mk/dosk#допс

Увидим ли мы какое-либо обновление по этому поводу?
Я думаю, что docker ps — самая распространенная команда. Я надеюсь, что не так сложно дать нам возможность фильтровать столбцы для отображения.
(Я бы ожидать что - то подобное , что )

бабки

Как сказал @AntouanK, а @wpp уже предложил, флаг столбцов будет предпочтительнее для большинства ситуаций.

Я думаю, что # 10255 должен решить эту проблему.

@duglin Делает ли это значение по умолчанию короче? Я бы хотел оставить это открытым, если нет.

@bfirsh хорошая мысль, нет, это не изменит значение по умолчанию. Но я не уверен, что мы можем изменить значение по умолчанию до версии 2 (если/когда это будет), потому что мы бы сломали существующие клиенты, если бы мы это сделали.

то же самое. может быть, какой-то интеллектуальный механизм, который выбирает столбцы по умолчанию, отображаемые путем применения пороговых значений к ENV['COLUMNS']?

Я согласен с https://github.com/docker/docker/issues/7477#issuecomment -70243594, просто дайте нам возможность выбрать столбцы.

Я также голосую за вариант https://github.com/docker/docker/issues/7477#issuecomment -70243594.
docker ps будет docker ps --columns=id,image,command,created,status,ports,name и можно было бы легко реализовать больше столбцов, таких как ip как того хотели некоторые пользователи https://github.com/docker/docker/issues/8786

+1 для --columns

В качестве обходного пути я комбинирую docker ps -q с docker inspect --format :

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

Вы должны копаться в выводе docker inspect и golang templating, но это почти бесконечно настраивается.

@jafcrocker Хороший. Может быть, мы можем сделать публичный список, чтобы сохранить набор обходных путей, подобных этому? Пока мы не получим несколько флагов для правильной настройки вывода...

мы только что объединили #14699, что позволяет вам запустить docker ps --format ... для изменения вывода ps. Вы также можете установить формат по умолчанию, если хотите, проверьте этот снимок экрана:

image

Я собираюсь закрыть эту проблему как исправленную. Пожалуйста, не стесняйтесь попробовать и дайте нам знать, что вы думаете.

Для тех, кто хочет попробовать, «основные» сборки можно найти по адресу https://master.dockerproject.org, и эта функция должна появиться там в ближайшее время (если еще не появилась).

Хотя --format — действительно хорошее дополнение, я не думаю, что оно решает основную проблему. Почти все инструменты командной строки, которые я использую ежедневно, правильно обрабатывают терминалы переменного размера. Большинство, глядя на переменную окружения $COLUMNS и отображая соответствующий текст.

Например, ps aux в терминале 80x24:
screenshot from 2015-07-23 00 47 35

И в терминале 137x24:
screenshot from 2015-07-23 00 49 35

Он изменяет ширину столбца и укорачивает команду, чтобы все хорошо помещалось в одну строку. Все для удобочитаемости и простоты разбора для человека.

Конечно, я могу написать оболочку bash, которая будет применять различные параметры форматирования в зависимости от $COLUMNS но это начинает звучать очень хакерски, и я думаю, что это должно быть поведением по умолчанию для любой программы командной строки. К сожалению, вывод docker беспорядочный и трудный для чтения.

Есть ли причина, по которой это не делается? Какие-то ограничения в какой-то библиотеке или решение с вашей стороны? Нужно знать, стоит ли это что-то исправить в PR, или, может быть, я ошибаюсь.

@nsg : Согласен - вывод по умолчанию все еще можно улучшить.

Были ли обновления по этому вопросу?

Поэтому по какой-то причине хэши изображений больше не усекаются в выводе ps. Мне уже приходилось делать свой терминал сверхшироким (занимающим весь экран) только для того, чтобы сделать докер пригодным для использования в прошлом, теперь этого уже недостаточно. Начиная с версии 1.7.1, каждая строка имеет ширину около 200 столбцов. Кто использует такой широкий терминал?

Я немного поигрался с этим.

Удаление ID и created немного помогает нам:

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"

Все равно слишком долго. Мы могли бы игнорировать 0.0.0.0 :

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"

Но все же немного долго. Возможно, требуется некоторый творческий подход, чтобы сократить статус ... что-то разборчивое / сканируемое, но все же короткое ... может быть, Exit (2) 23s ago ?

Хотя команду можно сократить, нам также потребуется сократить что-либо еще, чтобы убедиться, что отображается хотя бы часть команды. Не могу сократить имя. Возможно, изображение может получить "...", когда оно усечено. То же самое для длинных портов.

Мысли?

Некоторые хаки здесь: https://github.com/docker/docker/compare/master...bfirsh:7477-shorter-ps

@bfirsh Я думаю, ты что-то

Если вы измените статус (как вы сказали) на 23 секунды вместо 23 секунд и обрежете столбец изображений и портов, он должен быть достаточно коротким.

@bfirsh вы начинаете работать в представлении по умолчанию? Вы думаете о варианте --format , о котором говорят некоторые люди?

Кроме того, мы могли бы использовать s вместо sec и m вместо mins

@aanm у нас уже есть --format в докере 1.8. Вы также можете изменить поведение ps по умолчанию в файле конфигурации клиента, добавив что-то вроде этого:

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

Вы можете установить формат по умолчанию, который вам больше нравится.

Мне часто нужно увидеть текущее имя контейнера, чтобы запустить следующий docker exec для подключения.

Итак, я надеюсь, что если я смогу переместить NAMES после IMAGE , это будет хорошо, мне больше не нужна какая-то конфигурация.

Спасибо.

Проблема в докере 1.8.1 (fc21)
--format не знает об именах контейнеров.

docker ps --format "{{.ID}}t{{.Image}}t{{.CreatedAt}}t{{.RunningFor}}t{{.Status}}t{{.Name}}" -a
Ошибка синтаксического анализа шаблона: шаблон: :1:64: выполнение "" в <.Name>: имя не является полем типа структуры *ps.containerContext

Пока использую:
докер пс-а | перл -не 'грызть; @cols = разделить /s{2,}/, $_; $name=поп @cols; printf "%-28s %-20s %-20s %-30sn", $name, $cols[1], $cols[3], $cols[4]'

@parf заполнитель на самом деле называется Names :

https://github.com/calavera/docker/blob/missing_ps_placeholder/docs/reference/commandline/ps.md#formatting

спасибо @caiguanhao за вдохновение.

я просто оставлю это здесь:

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

Хорошо @GottZ , спасибо, что поделились!

@thaJeztah я только что

Между тем, мой подход с 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, почему бы и нет;

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

Это уже было зафиксировано и выпущено. Я не понимаю, почему это все еще открыто?

@thaJeztah , ты прав, спасибо :)

@ovidiub13 в основном из-за https://github.com/docker/docker/issues/7477#issuecomment -123898874

да это раздражает..

Обычно я просто усекаю значение ps по умолчанию по ширине столбца терминала:

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

+1 за --columns=name,id,status,image

Эта проблема все еще существует, к сожалению. В любом случае обходной путь заключается в том, чтобы поместить нижеприведенное (проверено в Ubuntu) в ваш .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'

Запуск watchdocker дает:

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 }}' даст вам это без выполнения всех этих вызовов API для каждого контейнера.
Также вы можете поместить это в ~/.docker/config.json чтобы сделать его форматом по умолчанию.

@ cpuguy83 какая версия поддерживает это? Мне никогда не удавалось заставить это работать, ни на работе, ни дома. Было бы круто, если бы в документах было указано какая версия какую поддерживает.

@Pithikos Либо 1,8, либо 1,9, не уверен.

бабки

правильное использование с ключевым словом «таблица» в строке формата, это даст вам хорошее форматирование с интервалом docker ps -a --format="table {{.ID}}\t{{.Names}}\t{{.Image}}\t{{.Command}}\t{{.Status}}"

Я закрываю это, так как кажется, что флаг --format для ps решает проблему. Спасибо всем!

Эта проблема, возможно, не была хорошо названа. По-прежнему остается, что _default_ для команд должно иметь ширину 80 символов. Рад, что это закрыли, потому что это не так важно.

--format кажется недостаточно хорошим.
https://docs.docker.com/engine/reference/commandline/ps/#/formatting

как насчет добавления опции, чтобы результат отображался вертикально, например, select * from foobar\G в MySQL

Обычно я просто хочу знать, какие контейнеры работают (и как долго).

Это помогает мне:

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

Более того, я обернул его действительно легко запоминающимся псевдонимом:

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

Вот пример вывода:

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

Вы можете узнать больше о команде --format здесь:
https://docs.docker.com/engine/reference/commandline/ps/

Надеюсь кому-нибудь поможет 😃

@joshmedeski вы также можете сохранить предпочтительное форматирование в файле конфигурации, чтобы оно использовалось по умолчанию; https://docs.docker.com/engine/reference/commandline/cli/#/configuration -files

В духе экономии нажатий клавиш вот небольшой скрипт bash, который я написал, чтобы получить список аргументов, построить строку шаблона go и выполнить команду docker ps, чтобы немедленно отобразить любые столбцы, которые требуются в любом порядке. Помещение конфигурации в файл недостаточно динамично — я считаю, что иметь один набор столбцов в один момент и другой набор через мгновение очень полезно. Скрипт здесь , надеюсь кому-нибудь пригодится. Ура -Энди

#!/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)

поместите это в свой ~/.docker/config.json
{ "psFormat": "table {{.Names}}\\t{{.Image}}\\t{{.RunningFor}} ago\\t{{.Status}}\\t{{.Command}}", "imagesFormat": "table {{.Repository}}\\t{{.Tag}}\\t{{.ID}}\\t{{.Size}}" }

И модифицировать на свое усмотрение. Для меня проблемой всегда было длинное имя изображения (поскольку оно содержало имя моего личного репозитория для моих пользовательских изображений)

всем, кто ищет лучший docker ps, следует проверить это:
https://github.com/moncho/сухой

Обходной хак. Измените, какие $cols[x] вы хотите сохранить по желанию.

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

Спасибо.

Это было все, что мне было нужно:
docker ps | perl -ne '<strong i="12">@cols</strong> = split /\s{2,}/, $_; printf "%30s %20s %20s", $cols[1], $cols[4], $cols[6]'

присвоение имён статуса изображения
в хорошо выровненных столбцах

РЕДАКТИРОВАТЬ

лучше создать псевдоним bash примерно так:

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

Обратите внимание на формат «таблица».

Обходной хак. Измените, какие $cols[x] вы хотите сохранить по желанию.

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

Это круто, спасибо

@nagracks, если вы хотите использовать этот формат по умолчанию, я бы рекомендовал использовать подход --format (который можно сохранить в вашем файле конфигурации ~/.docker/config.json )

Если я изменю свой файл .docker/config.json на что-то вроде этого:

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

Как я могу использовать команду docker ps для просмотра формата по умолчанию? Я пробовал docker ps --format "" , но все равно использовал конфиг.

Использование docker ps --format=table должно дать формат таблицы по умолчанию.

Я был бы очень признателен, если бы по умолчанию была доступна менее подробная версия вывода, без необходимости помнить, что такое синтаксис форматирования таблицы или каковы имена переменных в контексте форматирования. Даже если значение по умолчанию будет сохранено как есть, флаг для _предварительно отформатированной_ менее подробной версии будет полезен.

Что касается того, какую информацию можно было бы сократить из менее подробной версии, вот мои два цента:

  • Имя и идентификатор в большинстве случаев служат одной и той же цели, и такое можно исключить.
  • Создание даты и времени, вероятно, было бы хорошо, если бы его исключили из менее подробного вывода.
  • Я также лично был бы в порядке, если бы исключил порты из менее подробного вывода.

В моем случае использования я обычно просто хочу найти имя контейнера, для которого я буду запускать некоторые другие команды (например, на удаленном узле сервера), и вывод, заключенный в несколько строк, затрудняет поиск точное имя интересующего меня контейнера.

Я несколько разочарован «одобренным» решением здесь: «просто настройте псевдоним с параметром --format», как если бы вы всегда выполняли эти команды в средах, где у вас определен ваш псевдоним, или помните синтаксис форматирования и контекстные переменные.

Я все еще ежедневно сталкиваюсь с этой проблемой, FWIW. Мой текущий вывод docker ps -a составляет _180 символов в ширину_ — больше половины моего 27-дюймового экрана 4K!

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

Не следует ожидать, что средний пользователь будет использовать псевдоним своей команды docker ps только для того, чтобы сделать ее читаемой на терминале разумного размера. Возможно, он не должен быть меньше 80 символов, но точно не должен быть 180 символов.

У меня возникает соблазн открыть запрос на вытягивание в качестве соломенного человека. 😏

Была ли эта страница полезной?
0 / 5 - 0 рейтинги