CNB云原生开发环境届的瑞士军刀,详解qifei项目
注: 本文首发于: 一个项目,如何让你在CNB天天起飞 (opens new window)
# 背景
在 CNB 中,构建以及开发都是基于云原生环境构筑的,因此镜像成为这些操作的底层环境支撑,默认情况下,官方会以 cnbcool/default-dev-env:latest
作为拉起环境的基础镜像,但这个镜像只做了通用的基础封装,我们可以自己封装一些镜像,来作为开发与构建的基础环境。
打造一个趁手的基础镜像,这是我从接触CNB一开始就在做的事情,经过长时间的打磨与优化,我做出了一个近乎完美的云开发环境,它容纳了大量的效率实践,能涵盖你开发过程中的各种场景,下边我会逐一介绍,带你领略优雅的运维魅力。
# 详解项目
# 简介
- 项目地址: https://cnb.cool/znb/qifei (opens new window)
- 项目依赖镜像对应的 Dockerfile: https://cnb.cool/znb/images/-/blob/main/base/debian-all/Dockerfile (opens new window)
项目主页图:
# 如何使用
第一步:Fork 项目
访问开源项目地址:https://cnb.cool/znb/qifei (opens new window),点击右上角 Fork
按钮,将项目复制到你的组织下。
第二步:点击起飞
点击右上角起飞按钮,即可享受该项目。
# 自定义按钮
在 CNB 中,你可以通过 .cnb/settings.yml
配置文件,自定义项目的一些基础信息。我这里定义了Fork
和Issue
以及启动云开发
的自定义背景图,配置如下:
workspace:
launch:
button:
name: 🛫 起飞
description: 💪 逐步迈向运维的四个现代化:规范化,标准化,高效化,优雅化
hoverImage: .cnb/qifei.gif
cpus: 16
disabled: false
autoOpenWebIDE: false
issue:
button:
description: 🙋🏻♀️ I Have A Question
hoverImage: ".cnb/jushou.jpg"
fork:
button:
description: 🫵 年轻人,你很眼光
hoverImage: ".cnb/trump.gif"
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
更多配置,详见官方文档:UI 定制 (opens new window)
三个按钮的效果如下:
# 开发语言环境
项目镜像默认提供了 golang 和 nodejs 的开发环境,对应版本信息分别如下:
同时两个工具是基于nvm和gvm集成的,因此,如果临时开发项目版本不合适,可通过这两个工具快速切换版本。
因个人常用开发语言是这两个,因此默认集成了这两个语言,欢迎使用其他语言开发的同学,参考当前项目,定制贡献其他语言的环境。
# 终端支持 Oh My ZSH
即便是临时使用的 VScode 终端,也不能将就。
于是,经过一番探索,我把本地终端提效利器 Oh My ZSH
集成到了云开发环境中。
配置定义如下:
# set bash to zsh
RUN sh -c "$(wget -O- https://github.com/deluan/zsh-in-docker/releases/download/v1.2.1/zsh-in-docker.sh)" -- \
-t https://github.com/skylerlee/zeta-zsh-theme \
-p https://github.com/paulirish/git-open \
-p git -p ssh-agent -p 'history-substring-search' -p z -p wd \
-p sudo -p extract -p hitokoto -p colored-man-pages -p docker -p docker-compose \
-p https://github.com/zsh-users/zsh-autosuggestions \
-p https://github.com/zsh-users/zsh-syntax-highlighting \
-p https://github.com/zdharma-continuum/fast-syntax-highlighting \
chsh -s /bin/zsh root
RUN echo 'exec zsh' >> /root/.bashrc &&\
echo '# custom alias' > ~/.aliases.zsh &&\
echo 'alias src="source ~/.zshrc"' >> ~/.aliases.zsh &&\
echo 'alias cl="clear"' >> ~/.aliases.zsh &&\
echo 'alias bash="zsh"' >> ~/.aliases.zsh &&\
echo 'alias gop="git-open"' >> ~/.aliases.zsh &&\
echo 'alias dp="docker ps"' >> ~/.aliases.zsh &&\
echo 'alias di="docker images"' >> ~/.aliases.zsh &&\
echo 'alias cdw="cd /workspace"' >> ~/.aliases.zsh &&\
echo 'alias docker-compose="docker compose"' >> ~/.aliases.zsh &&\
echo 'alias ll="ls -lhtr"' >> ~/.aliases.zsh &&\
echo 'alias ..="cd .."' >> ~/.aliases.zsh &&\
echo 'alias ...="cd ../.."' >> ~/.aliases.zsh &&\
echo 'alias g="git"' >> ~/.aliases.zsh &&\
echo 'alias ping="docker run --rm --network host docker.cnb.cool/znb/images/alpine ping "' >> ~/.aliases.zsh &&\
echo 'alias gping="docker run --rm -ti --network host docker.cnb.cool/znb/images/gping "' >> ~/.aliases.zsh &&\
echo "alias openw='python3 -m webbrowser \"\$CNB_VSCODE_WEB_URL\"'" >> ~/.aliases.zsh &&\
echo "alias openv='python3 -m webbrowser \"\$CNB_VSCODE_REMOTE_SSH_SCHEMA\"'" >> ~/.aliases.zsh &&\
echo 'open() { python3 -m webbrowser "http://localhost:$1"; }' >> ~/.aliases.zsh &&\
echo 'openr() { python3 -m webbrowser "$(echo "${CNB_VSCODE_PROXY_URI//\{\{port\}\}/$1}")"; }' >> ~/.aliases.zsh &&\
echo "alias opendoc='python3 -m webbrowser https://cnb.cool/znb/qifei/-/issues/3'" >> ~/.aliases.zsh &&\
echo 'source ~/.aliases.zsh' >> ~/.zshrc
# 添加以下RUN命令来填充历史命令
RUN echo ': 1751940881:0;vim Dockerfile' >> /root/.zsh_history && \
echo ': 1751940882:0;vim docker-compose.yaml' >> /root/.zsh_history && \
echo ': 1751940883:0;docker-compose up -d' >> /root/.zsh_history && \
echo ': 1751940884:0;docker ps -a' >> /root/.zsh_history && \
echo ': 1751940885:0;open 8888' >> /root/.zsh_history
CMD [ "/bin/zsh" ]
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
我在定义环境时集成了一些 alias 快捷命令,具体内容可看上边内容,这里捡一些比较典型的介绍下,让你了解并用起来:
cl
:执行 clear 命令,清除当前屏幕终端上的任何信息。gop
:执行git-open命令,功能是在CNB打开当前项目。顺便说一句,这个功能是我提交的反馈,详见:https://cnb.cool/cnb/feedback/-/issues/450 (opens new window)di
,dp
:docker 相关的一些快捷别名。cdw
:无论你在环境中去了哪里,执行之后让你回到工作目录。..
,...
:无需写入 cd,直接往上层和上上层目录返回。openw
:表示打开当前项目的WebIDE界面,如果你当前在vscode界面中,想要跳转打开WebIDE界面,通常需要先到CNB中点击个人头像
然后点击我的云原生开发
,找到项目的WebIDE按钮,点击跳转。而有了这个别名,一条命令就让你实现跳转。openv
:如上同理,如果你当前所在位置是WebIDE中,此时想要打开vscode远程开发,那么可以直接执行openv
命令进行跳转,而不用再去个人主页查找。(实测发现对应变量的渲染需要通过vscode打开过之后才会生成)open
:表示从本地打开要访问的端口。比如执行:open 8888
则表示在浏览器打开http://localhost:8888
。openr
:表示从远程监听打开要访问的端口。比如执行:openr 8888
则表示在浏览器打开https://parye2fki0-8888.cnb.run/
当前,在WebIDE中打开远程访问端口,还需要进行二次确认,这个问题会在不久的将来发版中解决,让你真正一键打开。关于此功能的讨论,详见:https://cnb.cool/cnb/feedback/-/issues/1183 (opens new window)
opendoc
:打开当前文档。如果你想详细了解这个项目有哪些最佳实践,可以通过opendoc
打开文档来浏览。
默认安装了这些插件:git-open
, git
, ssh-agent
, history-substring-search
, z
, wd
, sudo
, extract
, hitokoto
, colored-man-pages
, docker
, docker-compose
, zsh-autosuggestions
, zsh-syntax-highlighting
, fast-syntax-highlighting
,挑一些比较有代表性的来介绍下。
zsh-autosuggestions
:一个提供输入建议的插件。因为输入建议是基于历史命令来渲染的,为了让你新开环境时可以直接用一些常用操作,我把一些常用的几个 docker 拉起项目的操作写到了历史命令,这样打开终端之后,你可以直接执行,获得提醒,如下图,灰色部分是智能提示的候选内容。extract
:任何压缩包,都可以在终端中,用 x 命令解压。zsh-syntax-highlighting
:终端美化效果,自动对不同内容着色。z
:zsh中强大的跳转插件,它自动解析历史执行过的cd命令,当你下次想要切换到哪个目录,通过z 关键字
就能跳转。
之所以把这个终端环境打造的如此舒服,就是因为 CNB 的优势在于,它不仅给我们提供了临时的开发环境,还几乎给我们提供了一台随时可用的服务器,如果想要做什么实验,或者搭建什么临时环境,都可以在这个临时服务器上完成,用完销毁即刻,也不用担心因为不熟悉把本地环境搞坏。
# 丰富的开发工具
一个优雅的开发环境,怎能少了常用的数据库等环境,别急,qifei 仓库已为你贴心集成。
假如你现在开发的项目需要一个 MySQL 环境,只需如下命令:
只需要两条命令,依赖的 MySQL 环境,就已到位。
除了 MySQL,还集成了 Redis,MongoDB,PostgreSQL 几个数据库,均可在 README 中看到:
再分享下我是如何实现拉起环境,就能快速跳转的,上文介绍过 z
这个插件,并且 z
还提供了一个 --add
指令,用于将指定目录填写到列表中,于是,我在 .cnb/vscode.yml
中做了如下定义:
stages:
- name: start
script: |
current_time=$(date +%s)
find /workspace/letsfly -mindepth 1 -maxdepth 2 -type d | while read dir
do
echo "$dir|1000|$current_time"
done >> /root/.z
2
3
4
5
6
7
8
用于把提供的工具快捷方式写入到列表,使得这些项目均可以通过 z 关键字
的方式,跳转到对应目录。目录列表如下:
# database 插件
上边介绍了数据库的拉起,同时我也在环境中集成了 mysql 等命令行客户端,但这仍然非常低效,不符合我们高效的宗旨。
别急,vscode 的插件 database 解你忧,它支持如下截图中的中间件连接管理,几乎涵盖了你开发场景中能遇到的所有存储。
插件提供付费订阅的计划,不过免费版限制最多 3 个连接,对我们临时开发环境来说,足够使用了。
# 各种优秀开源项目即刻体验
除了开发环境的集成,项目还内置了一批个人感觉很不错的开源项目的 compose,可供一键拉起,快速体验。
目前配置的项目列表如下:
你如果还有更好玩的项目,欢迎提交 PR 贡献你的项目。
# one more thing
除了如上介绍的各种摆在面上的可以利用的提效工具之外,qifei 还内置了不少优秀的工具,奉献给懂的人。
air
:go 语言编写的热加载工具,开发 go 语言项目的时候,可以直接使用。
upx
:优秀的二进制压缩工具,无论是在云原生开发还是云原生构建环境中,都可以直接使用。
gox
:go 语言多架构平台二进制并发交叉编译的工具。
gping
:更强大的 ping 检测命令。(这个工具通过如上展示过的 alish 命令定义)
运行 gping cnb.run tencent.com eryajf.net
,执行效果如下:
dufs
:让云开发过程中产生的制品,在本地下载。
# 结语
CNB 是一个开启程序员开发构建新篇章的一个产品,善用各种效率工具,借助其提供的能力,可以实现各种玩法。
欢迎大家来仓库交流更多优秀的玩法。

