配置与实现解析)
Spaceship Prompt 的 Docker Compose 状态指示模块docker_compose配置与实现解析【免费下载链接】spaceship-prompt✨ Minimalistic, powerful and extremely customizable Zsh prompt项目地址: https://gitcode.com/gh_mirrors/sp/spaceship-prompt导读本文围绕 Spaceship Prompt 的docker_compose模块展开讲解它如何通过一条命令读取当前目录下 Docker Compose 项目中每个容器的运行状态并将状态以容器名首字母 颜色的形式直接渲染进 Zsh 提示符。读完本文你将掌握该模块的显示触发条件、9 个可调配置项及其默认值、状态着色规则以及它背后upsearch 探测 compose 文件 → 解析docker-compose ps输出 → 按状态着色拼接的完整实现链路并了解如何通过SPACESHIP_PROMPT_ORDER把它接入自己的提示符。模块定位多容器应用状态的可视化窗口docker_compose是 Spaceship Promptspaceship.zsh众多内置 section 之一。它的核心职责非常聚焦展示当前目录 Docker Compose 项目中各个容器的实时运行状态。它只在包含docker-compose.yml、docker-compose.yaml、compose.yml或compose.yaml的项目目录中显示见 docs/sections/docker_compose.md它为每一个容器输出一个由容器名首字母大写构成的指示符indicator并按容器状态着色该模块默认异步渲染不会阻塞提示符的刷新。状态判定与着色规则模块为每个运行中的容器显示一个字母标记颜色对应容器状态容器状态颜色含义Up/runninggreenSPACESHIP_DOCKER_COMPOSE_COLOR_UP容器正在运行Paused/pausedyellowSPACESHIP_DOCKER_COMPOSE_COLOR_PAUSED容器已暂停其他状态如Exit、exitedredSPACESHIP_DOCKER_COMPOSE_COLOR_DOWN容器已停止或出错以上规则与官方文档一致见 docs/sections/docker_compose.md 的状态说明而其判定逻辑可以精确地在 sections/docker_compose.zsh 中找到if [[ $line *Up* ]] || [[ $line *running* ]]; then color$SPACESHIP_DOCKER_COMPOSE_COLOR_UP elif [[ $line *Paused* ]] || [[ $line *paused* ]]; then color$SPACESHIP_DOCKER_COMPOSE_COLOR_PAUSED else color$SPACESHIP_DOCKER_COMPOSE_COLOR_DOWN fi可以看到源码采用大小写双匹配的字符串判断凡输出行包含Up或running即视为运行中包含Paused或paused即视为暂停其余一律落入停止/错误分支。这正是为什么容器名的首字母会以不同颜色呈现在提示符中——一眼即可判断哪些服务健康、哪些需要处理。配置参数一览模块的所有行为均可通过环境变量定制。完整参数表如下取自 docs/sections/docker_compose.md 的 Options 章节默认值与 sections/docker_compose.zsh 中的初始化代码一致变量默认值含义SPACESHIP_DOCKER_COMPOSE_SHOWtrue是否显示该 sectionSPACESHIP_DOCKER_COMPOSE_ASYNCtrue是否异步渲染该 sectionSPACESHIP_DOCKER_COMPOSE_PREFIXrunssection 的前缀SPACESHIP_DOCKER_COMPOSE_SUFFIX$SPACESHIP_PROMPT_DEFAULT_SUFFIXsection 的后缀SPACESHIP_DOCKER_COMPOSE_SYMBOLsection 开头显示的符号SPACESHIP_DOCKER_COMPOSE_COLORcyansection 整体颜色SPACESHIP_DOCKER_COMPOSE_COLOR_UPgreen运行中容器的指示符颜色SPACESHIP_DOCKER_COMPOSE_COLOR_DOWNred已停止/出错容器的指示符颜色SPACESHIP_DOCKER_COMPOSE_COLOR_PAUSEDyellow已暂停容器的指示符颜色需要留意的细节PREFIX 默认值自带空格源码中SPACESHIP_DOCKER_COMPOSE_PREFIX${SPACESHIP_DOCKER_COMPOSE_PREFIXruns }即默认前缀是runs注意结尾空格渲染后形如runs A D WSUFFIX 回退到全局默认后缀SPACESHIP_DOCKER_COMPOSE_SUFFIX默认取$SPACESHIP_PROMPT_DEFAULT_SUFFIX其默认值为一个空格见 docs/config/prompt.md。这一未设置则回退全局默认的模式在整个项目中普遍存在例如 docs/advanced/creating-section.md 中的SPACESHIP_FOOBAR_SUFFIX同样如此。自定义示例在.zshrc中加载 Spaceship 后、Prompt 渲染前设置环境变量即可覆盖默认值例如# 关闭该 section SPACESHIP_DOCKER_COMPOSE_SHOWfalse # 自定义前缀与符号 SPACESHIP_DOCKER_COMPOSE_PREFIXcompose: SPACESHIP_DOCKER_COMPOSE_SYMBOL # 自定义状态颜色 SPACESHIP_DOCKER_COMPOSE_COLOR_UPblue SPACESHIP_DOCKER_COMPOSE_COLOR_DOWNmagenta SPACESHIP_DOCKER_COMPOSE_COLOR_PAUSEDwhite如何把该 section 加入提示符docker_compose默认是否显示取决于SPACESHIP_PROMPT_ORDER。若它未出现在你的提示符中可通过SPACESHIP_PROMPT_ORDER显式加入SPACESHIP_PROMPT_ORDER( user # 用户名 dir # 当前目录 git # Git 状态 docker_compose # Docker Compose 容器状态 char # 末尾提示符符号 )若已显式加入但仍不显示请对照排查确认当前目录或向上任意父目录存在四个目标文件名之一、确认docker-compose命令可用、确认docker-compose ps -a能正常输出容器信息。实现原理从探测文件到渲染指示符该 section 的全部逻辑集中在 sections/docker_compose.zsh整体分三步。了解这些细节有助于你在排查为什么没显示/颜色不对时快速定位。第一步前置条件检查文件探测 命令可用性spaceship_docker_compose() { [[ $SPACESHIP_DOCKER_COMPOSE_SHOW false ]] return spaceship::exists docker-compose || return local docker_compose_globs(docker-compose.y*ml compose.y*ml) spaceship::upsearch -s $docker_compose_globs || return ... }若SPACESHIP_DOCKER_COMPOSE_SHOW为false直接返回不渲染任何内容spaceship::exists docker-compose检测系统中是否存在docker-compose可执行文件spaceship::upsearch -s docker-compose.y*ml compose.y*ml从当前目录逐级向上查找compose 文件-s为静默模式只返回成功/失败不打印路径。upsearch的实现见 lib/utils.zsh它会一路向父目录查找直到遇到.git或.hg目录边界为止找到即成功返回找不到则返回非零状态——这也是该模块只在Compose 项目目录内显示的根源。第二步调用 docker-compose 读取容器列表local containers$(docker-compose ps -a 2/dev/null | tail -n2) [[ -n $containers ]] || returndocker-compose ps -a列出项目内全部容器含已停止的tail -n2去掉表头行若输出为空没有容器直接返回section 不显示。关于输出格式仓库中的测试桩 tests/stubs/docker-compose 模拟了真实输出Name Command State Ports --------------------------------------------------------------------------------------------------------- adminer entrypoint.sh docker-php-e ... Up 0.0.0.0:8080-8080/tcp,:::8080-8080/tcp db docker-entrypoint.sh mariadbd Exit 255 3306/tcp watchtower /watchtower Paused 8080/tcp可以看到State列包含Up/Exit/Paused等状态词这正是上文中字符串匹配判定颜色的依据。第三步逐行解析并着色拼接while IFS read -r line; do local letter_position$(echo $line | awk match($0,_){print RSTART}) local letter$(echo ${line:$letter:1} | tr [:lower:] [:upper:]) local color [[ -z $letter ]] continue if [[ $line *Up* ]] || [[ $line *running* ]]; then color$SPACESHIP_DOCKER_COMPOSE_COLOR_UP elif [[ $line *Paused* ]] || [[ $line *paused* ]]; then color$SPACESHIP_DOCKER_COMPOSE_COLOR_PAUSED else color$SPACESHIP_DOCKER_COMPOSE_COLOR_DOWN fi statuses$(spaceship_docker_compose::paint $color $letter) done $containers对每行容器记录用awk找到名字中第一个_的位置Compose 生成的容器名形如项目名_服务名_序号取该位置的首字母并转为大写作为指示符按上述状态规则判定颜色后调用工具函数spaceship_docker_compose::paint生成 ANSI 着色文本spaceship_docker_compose::paint() { local color$1 text$2 echo -n %{%F{$color}%}$text%{%f%} }最终通过spaceship::section输出带前缀、后缀、符号的完整 sectionspaceship::section \ --color $SPACESHIP_DOCKER_COMPOSE_COLOR \ --prefix $SPACESHIP_DOCKER_COMPOSE_PREFIX \ --suffix $SPACESHIP_DOCKER_COMPOSE_SUFFIX \ --symbol $SPACESHIP_DOCKER_COMPOSE_SYMBOL \ $statuses测试验证期望渲染结果仓库用 shunit2 为该模块编写了完整测试见 tests/docker_compose.test.zshtest_docker_compose_no_files目录中没有 compose 文件时section 完全不渲染expected为空字符串test_docker_compose_configs依次在目录中创建docker-compose.yml、docker-compose.yaml、compose.yml、compose.yaml四种文件断言渲染结果为%{%B%}runs %{%b%}%{%B%F{cyan}%} %{%F{green}%}A%{%f%}%{%F{red}%}D%{%f%}%{%F{yellow}%}W%{%f%}%{%b%f%}即runs A D W——其中Aadminer绿色、Ddatabase红色、Wwatchtower黄色。该测试同时验证了两个关键事实四种 compose 文件名都能触发渲染且状态着色与 sections/docker_compose.zsh 的判定逻辑完全对应。常见问题与排查思路section 完全不显示检查当前目录及所有父目录直到 Git/Hg 仓库边界是否存在四种 compose 文件之一确认docker-compose命令已安装并在PATH中源码通过spaceship::exists检测确认docker-compose ps -a有输出无容器时 section 同样不显示。容器状态与颜色不符合预期状态判定依赖docker-compose ps输出中的Up/running/Paused/paused等关键词若自定义过docker-compose ps的格式化输出可能影响匹配结果提示符中请启用颜色如TERM支持 256 色测试中即设定了TERMxterm-256color。希望关闭异步渲染设置SPACESHIP_DOCKER_COMPOSE_ASYNCfalse即可模块默认异步参见文档说明与 sections/docker_compose.zsh。小结docker_composesection 用最直观的首字母 颜色把多容器应用的健康状态搬进了提示符runs 前缀、青色 section、绿/黄/红三色容器指示符。理解它的四类触发条件、九项配置与三步渲染流程文件探测 → 命令读取 → 状态着色你就能在需要时自由定制也能快速定位任何显示异常。若想深入了解 section 的通用编写规范可继续阅读 docs/advanced/creating-section.md若需查阅该 section 的配置总览可对照 docs/config/intro.md。【免费下载链接】spaceship-prompt✨ Minimalistic, powerful and extremely customizable Zsh prompt项目地址: https://gitcode.com/gh_mirrors/sp/spaceship-prompt创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考