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。
答案 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)
因为从根本上讲这是一个码头工人问题,而不是bash问题,所以您甚至不需要别名。 Docker CLI允许您在自己的配置文件中自定义这些命令!来自Container 42的精彩提示:
创建或找到您的docker配置文件(如果您曾经使用过docker login
,则应该已经创建了它。
~/.docker/config.json
然后为docker每次运行ps
命令时使用的默认格式添加为配置中的顶级属性:
{
"psFormat": "table {{.Image}}\t{{.Names}}\t{{.Ports}}\t{{.Status}}",
}
然后像平常一样运行docker 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"