我可以别名一个子命令吗? (缩短`docker ps`的输出)

时间:2016-01-12 16:22:55

标签: docker zsh

docker命令有一个ps子命令,它发出很长的行:

$ docker ps -a
CONTAINER ID        IMAGE                             COMMAND                  CREATED             STATUS                      PORTS                                                                                                                                                                                                                                                                                                        NAMES
6e8ec8a16da4        waisbrot/wait:latest              "/wait"                  4 minutes ago       Exited (0) 4 minutes ago                                                                                                                                                                                                                                                                                                                 wait-for-janus-test
9dbf0739561f        whoop/downsampler:master          "./run.bash"             4 minutes ago       Up 4 minutes                0.0.0.0:32855->4369/tcp, 0.0.0.0:32854->9100/tcp, 0.0.0.0:32853->9101/tcp, 0.0.0.0:32852->9102/tcp, 0.0.0.0:32851->9103/tcp, 0.0.0.0:32850->9104/tcp, 0.0.0.0:32849->9105/tcp, 0.0.0.0:32848->9106/tcp, 0.0.0.0:32847->9107/tcp, 0.0.0.0:32846->9108/tcp, 0.0.0.0:32845->9109/tcp, 0.0.0.0:32844->9110/tcp   metrics-downsampler-test
6cf56623bb48        whoop/janus:master                "./start.bash"           4 minutes ago       Up 4 minutes                0.0.0.0:32843->80/tcp                                                                                                                                                                                                                                                                                        janus-test
882b50303d54        whoop/recalculator:master         "./run.bash"             4 minutes ago       Exited (1) 4 minutes ago                                                                                                                                                                                                                                                                                                                 internum-test

可以指示仅输出特定列:

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

我希望能够说docker ps并为我添加--format "table..."参数。有一个很好的方法来做到这一点?

我知道我可以说

alias dp='docker ps --format ...'

但我更喜欢保留子命令。

我正在使用zsh作为我的shell。

4 个答案:

答案 0 :(得分:11)

您可以将docker包装在检查特定子命令的函数中,并传递其他所有内容。 (以下实际上不仅适用于zsh,而且适用于任何符合POSIX标准的shell - zsh并不属于的类别。)

docker() {
  case $1 in
    ps)
      shift
      command docker ps --format 'table {{.Image}}\t{{.Names}}\t{{.Ports}}\t{{.Status}}' "$@"
      ;;
    *)
      command docker "$@";;
  esac
}

如果您想要一个更通用的包装函数(不需要知道您特定的所需ps逻辑),可以按如下方式完成(请注意,此版本不< / em>由于使用了local而与基线POSIX sh兼容;但是,这是即使ash及其派生词实现的扩展:

docker() {
  local cmd=$1; shift
  if command -v "docker_$cmd" >/dev/null 2>/dev/null; then
    "docker_$cmd" "$@"
  else
    command docker "$cmd" "$@"
  fi
}

...之后任何子命令都可以定义自己的函数,而不需要修改包装器来了解它们(你也可以在名为docker_ps的PATH中创建一个脚本,或者提供命令你选择的任何其他方式):

docker_ps() {
  command docker ps --format 'table {{.Image}}\t{{.Names}}\t{{.Ports}}\t{{.Status}}' "$@"
}

答案 1 :(得分:1)

您可以为子命令添加别名。使用别名,您仍然可以像输入完整命令一样获得不错的zsh补全。这就是为什么我更喜欢它们而不是函数。

您的别名等同于:

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

但是现在似乎建议使用完整的命令,ls已替换ps,这使您现在成为别名:

alias dp='docker container ls --format "table {{.Image}}\t{{.Names}}\t{{.Ports}}'\t{{.Status}}"

拥有所有内容的Docker别名真是太好了。为此,我一直在研究一组comprehensive aliases,该别名的别名如下:

alias ddcls='docker container ls --format "table {{.Image}}\t{{.Names}}\t{{.Ports}}\t{{.Status}}"

答案 2 :(得分:1)

使用Docker Config

因为从根本上讲这是一个码头工人问题,而​​不是bash问题,所以您甚至不需要别名。 Docker CLI允许您在自己的配置文件中自定义这些命令!来自Container 42的精彩提示:

  1. 创建或找到您的docker配置文件(如果您曾经使用过docker login,则应该已经创建了它。

    ~/.docker/config.json
    
  2. 然后为docker每次运行ps命令时使用的默认格式添加为配置中的顶级属性:

    {
        "psFormat": "table {{.Image}}\t{{.Names}}\t{{.Ports}}\t{{.Status}}",
    }
    
  3. 然后像平常一样运行docker ps

    docker ps

PS格式

Docker使用go templates并有一个list of the valid placeholders

| Command      | Description                                       |
| ------------ | ------------------------------------------------- |
| .ID          | Container ID                                      |
| .Image       | Image ID                                          |
| .Command     | Quoted command                                    |
| .CreatedAt   | Time when the container was created.              |
| .RunningFor  | Elapsed time since the container was started.     |
| .Ports       | Exposed ports.                                    |
| .Status      | Container status.                                 |
| .Size        | Container disk size.                              |
| .Names       | Container names.                                  |
| .Labels      | All labels assigned to the container.             |
| .Label       | Value of a specific label for this container.     |
| .Mounts      | Names of the volumes mounted in this container.   |
| .Networks    | Names of the networks attached to this container. |

替代解决方案/线程

答案 3 :(得分:0)

就我而言,我只需要禁用 docker login 命令(有些人在我们的 CI-runner 上使用该命令破坏了 docker 的通用配置文件)。 所以,我添加到我的 .bashrc:

_docker() {
  if [ "$1" = "login" ]; then
    echo "login is disabled, to login please update a config file manually!"
    return
  fi
  
  /usr/bin/docker "$@"
}

alias docker="_docker"