CNB切换默认开发环境
有的时候在CNB云原生开发中,默认的开发环境不是最佳的选择,需要自定义WebIDE的开发环境,官方提供了自定义的环境切换方法,通过声明式的语法,去指定你需要的版本镜像即可。或者是使用Dockerfile定义系统的环境。
一、云原生开发环境
基于云原生构建的远程开发解决方案,支持通过 WebIDE、VSCode 客户端、Cursor 客户端连接远程开发环境进行远程开发。
具有以下特点:
- 声明式:基于 Docker 生态,Dockerfile 声明开发环境,与代码同源管理
- 快速启动:即使是超大仓库,也可以数秒准备好代码和环境
- 按需使用:按需获取开发资源,闲时快速回收,避免资源浪费
官方文档地址:https://docs.cnb.cool/zh/workspaces/intro.html
二、默认环境说明
默认操作系统:Debian GNU/Linux 12 (bookworm)
CNB默认的云原生开发镜像是 cnbcool/default-dev-env:latest
其中包括如下软件:git
、rsync
、 jqgit-lfs
、 vimcurlwget
、 unzip
、 lsofnload
、 htop
、 net tools
、 dnsutils
、openssh-server
vscode的默认插件:coding-copilot
、 vscode-yaml
、githistory
、 gitblame
、git-graph
、 vscode-yaml
、 live-server
包含 oh-my-zsh 插件:git
zsh-autosuggestions
, zsh-syntax-highlighting
官方默认镜像地址:https://cnb.cool/cnb/cool/default-dev-env
三、自定义镜像
在cnb控制台去创建一个空的仓库,然后在仓库创建一个.cnb.yml即可。
直接指定镜像
直接指定开发环境系统镜像如下。
1 2 3 4 5 6 7 8 9 10 11
| $: vscode: - docker: image: ubuntu:24.04 service: - vscode - docker stages: - name: ls script: ls -al
|
该方式所指定的系统环境是不具备开发环境的。可以进入系统后再做安装(不方便)。
进入云开发环境以后可以通过以下命令查看操作系统版本

通过Dockerfile自定义系统环境
由于直接指定镜像,是不具备开发环境的依赖和软件的,所以还可以通过Dockerfile自己定义系统环境。
在仓库的根目录去添加.ide/Dockerfile
文件目录。如果未自定义启动流水线,启动开发环境时使用默认流水线创建开发环境。 默认流水线会优先使用 .ide/Dockerfile
构建一个镜像,作为开发环境基础镜像。
启动开发环境的默认流水线中,同时配置了 默认镜像
和 .ide/Dockerfile
, 如果 .ide/Dockerfile
不存在或构建失败,会使用 默认镜像
作为开发环境基础镜像。 如果遇到启动的环境不符合预期,可以查看构建日志 prepare
阶段 .ide/Dockerfile
是否构建成功
1、官方默认docker自定义系统镜像示例地址,点这里。他是基于node的镜像。这里还是使用ubuntu:24.04做演示。dockerfile文件内容如下:
1 2 3 4
| FROM ubuntu:24.04
ENV LANG=C.UTF-8 ENV LANGUAGE=C.UTF-8
|
2、修改.cnb.yml文件如下。完成后直接点击【云原生开发】按钮,就可以通过Dockerfile去启动一个ubuntu:24.04的系统镜像了。
1 2 3 4 5 6 7
| $: vscode: - docker: build: .ide/Dockerfile service: - vscode - docker
|
3、通过上述定义的系统镜像仍然是没有开发环境依赖和软件的,通过以下内容可以添加依赖和软件。
.ide/Dockerfile文件内容
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| FROM ubuntu:24.04
RUN apt-get update && \ apt-get install -y wget curl unzip lsof nload htop net-tools dnsutils openssh-server zsh
RUN curl -fsSL https://code-server.dev/install.sh | sh && \ code-server --install-extension cnbcool.cnb-welcome && \ code-server --install-extension redhat.vscode-yaml && \ code-server --install-extension waderyan.gitblame && \ code-server --install-extension mhutchie.git-graph && \ code-server --install-extension donjayamanne.githistory && \ code-server --install-extension cloudstudio.live-server && \ code-server --install-extension tencent-cloud.coding-copilot && \ code-server --install-extension Vue.volar ENV LANG=C.UTF-8 ENV LANGUAGE=C.UTF-8
|
当然也完全可以进入开发环境以后再去安装相应的软件和插件。
4、可以根据自己的需要自定vscode的插件,在vscode的客户端中去扩展界面查看插件的ID。复制完插件ID到Dockerfile的相应位置即可。

5、提交会自动触发系统的构建,可以在【云原生构建】模块查看构建日志。进入云原生开发界面中,可以验证软件和插件安装如下。

制作成docker镜像
使用上述方法每次打开云开发环境的时候,都会去创建一个新的镜像,然后安装软件和依赖,这可能会花费好几分钟的时间,可以把环境构建成docker镜像,这样几秒中就可以启动云开发环境了。这里把开发环境制作成镜像推送到CNB的制品库中。
方式一:使用默认系统环境构建自定义镜像。
1、先修改.cnb.yml文件使整个云开发环境是默认的debian系统。才有docker环境。修改完成后,进入云开发环境。.cnb.yml修改如下
1 2 3 4 5 6 7
| $: vscode: - docker: image: cnbcool/default-build-env:latest service: - vscode - docker
|
2、在云开发环境终端中去构建镜像,首先进入.ide/目录,Dockerfile文件内容和第三小节一致,输入以下指令。
1 2 3
| cd .ide docker build -t docker.cnb.cool/hudi22/test001/ubuntu:24.04 . docker push docker.cnb.cool/hudi22/test001/ubuntu:24.04
|
docker build -t docker.cnb.cool/{组织名}/{仓库明}/{镜像名称}:{版本} .
整个镜像的构建和推送速度都是非常快的。
3、构建完成后可以在仓库的制品栏目去看到系统的镜像如下。

4、使用制作好的镜像,直接在.cnb.yml中声明就行了,如下。
1 2 3 4 5 6 7
| $: vscode: - docker: image: docker.cnb.cool/hudi22/test001/ubuntu:24.04 service: - vscode - docker
|
但是这种方式构建的系统镜像是不具备docker环境。也就是在云开发环境中是没办法使用docker服务。
方式二:基于默认开发环境仓库构建自定义镜像
为了使我们自定义的开发环境具备docker服务,可以先fork这个官方的默认环境仓库,点这里fork。fork仓库完成后只需要修改Dockerfile少部分内容。
系统默认的Dockerfile文件内容点这里查看。
1 2 3 4
| - FROM cnbcool/default-build-env:latest #将这行替换成FROM ubuntu:24.04,或者是其他的镜像如node等 + FROM ubuntu:24.04 + RUN curl -fsSL https://code-server.dev/install.sh | sh &&\ #根据需要去安装相应的vscode插件 + RUN apt-get update && apt-get install -y wget unzip lsof nload htop net-tools dnsutils openssh-server zsh #根据需要安装相应的软件
|
修改完成后✅,进入云原生开发环境中去构建系统开发环境镜像。构建docker镜像的命令同上。
构建完成后需要在其他项目使用这个自定义的系统镜像。需要修改.cnb.yml如下即可。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| $: vscode: - docker: image: docker.cnb.cool/hudi22/test001/ubuntu:24.04 by: - settings.json - cnb-init-from - cnb-init-from-without-lfs - gitconfig - scripts/add-zsh-plugins.sh - scripts/set-zsh-env.sh services: - vscode - docker
|
四、构建Python开发环境
可以直接通过Python的镜像去指定开发环境,但是这里我们在默认系统镜像上去修改,把debian改成ubuntu:24.04的基础上去添加Python的环境。在Dockerfile中去声明安装python3和pip3还有UV包管理器。再指定vscode支持Python的插件。然后在环境启动的时候直接启动MySQL、Redis。
Dockerfile信息如下:
1 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 43 44 45 46
| FROM ubuntu:24.04
ENV UV_INSTALL_DIR=/usr/local/bin
RUN apt-get update && apt-get install -y git curl wget unzip lsof nload htop net-tools dnsutils openssh-server zsh python3.6 python3-pip
RUN curl -fsSL https://code-server.dev/install.sh | sh &&\ code-server --install-extension cnbcool.cnb-welcome &&\ code-server --install-extension redhat.vscode-yaml &&\ code-server --install-extension waderyan.gitblame &&\ code-server --install-extension mhutchie.git-graph &&\ code-server --install-extension donjayamanne.githistory &&\ code-server --install-extension cloudstudio.live-server &&\ code-server --install-extension tencent-cloud.coding-copilot && \ code-server --install-extension ms-python.python && \ code-server --install-extension ms-python.debugpy
RUN sh -c "$(curl -LsSf https://astral.sh/uv/install.sh)"
COPY scripts ./scripts
RUN sh -c "$(curl -fsSL https://raw.githubusercontent.com/ohmyzsh/ohmyzsh/master/tools/install.sh)" && \ git clone https://github.com/zsh-users/zsh-autosuggestions ${ZSH_CUSTOM:-~/.oh-my-zsh/custom}/plugins/zsh-autosuggestions && \ git clone https://github.com/zsh-users/zsh-syntax-highlighting.git ${ZSH_CUSTOM:-~/.oh-my-zsh/custom}/plugins/zsh-syntax-highlighting && \ chmod +x ./scripts/*.sh && \ ./scripts/add-zsh-plugins.sh zsh-autosuggestions zsh-syntax-highlighting && \ ./scripts/set-zsh-env.sh && \ echo 'setopt NO_AUTO_REMOVE_SLASH' >> /root/.zshrc && \ chsh -s $(which zsh)
RUN sed -i '1isetopt NULL_GLOB 2>/dev/null\nsource /etc/profile\nunsetopt NULL_GLOB 2>/dev/null' $HOME/.zshrc
COPY settings.json /root/.vscode-server/data/Machine/settings.json COPY settings.json /root/.local/share/code-server/Machine/settings.json COPY cnb-init-from /bin/cnb-init-from COPY cnb-init-from-without-lfs /bin/cnb-init-from-without-lfs COPY gitconfig /root/.gitconfig
ENV LANG=C.UTF-8 ENV LANGUAGE=C.UTF-8
|
现在去修改.cnb.yml的内容如下
1 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
| main: pull_request: - services: - docker stages: - docker build .
$: vscode: - docker: build: dockerfile: .ide/Dockerfile by: - settings.json - cnb-init-from - cnb-init-from-without-lfs - gitconfig - scripts/add-zsh-plugins.sh - scripts/set-zsh-env.sh env: CNB_WELCOME_CMD: echo "Welcome to 短巷与雨 CNB 😊" services: - vscode - docker stages: - name: start mysql script: docker run -d -p 3306:3306 -v /workspace/mysql/log:/var/log/mysql -v /workspace/mysql/data:/var/lib/mysql -v /workspace/mysql/conf:/etc/mysql/conf.d -e MYSQL_ROOT_PASSWORD=123456 --name mysql mysql:5.7 - name: start redis script: docker run --name redis -p 6379:6379 -d -v /workspace/redis/data:/data redis:6.0.8 - name: 创建项目虚拟环境 script: uv venv - name: 激活虚拟环境 script: . /workspace/.venv/bin/activate - name: 安装项目所需依赖包 script: uv pip install mysql.connector
|
把Mysql和Redis的数据卷目录写到/workspace/目录下。这样在提交代码时,数据文件也会跟着提交到代码仓库就能起到一个持久化数据的目的。注意:这里Mysql和Redis都没有指定配置文件,你可以自行在/workspace目录下编写Mysql和Redis的配置文件,当然可以在stages中可以指定任意你需要的软件。注意:这里的持久化目录会提交到代码仓库,重要数据不要这么操作。或者是私有化仓库。
启动云开发环境完成后,在vscode的终端栏可以看到启动了Mysql和Redis两个服务。

这里我直接进入mysql的容器中使用sql命令去创建的测试数据库和表还有数据。
1 2 3 4 5 6 7 8 9 10 11 12
| docker exec -it mysql /bin/sh #进入容器 mysql -uroot -p123456 #进入mysql #创建数据库和表 create database test02; use test02; create table test02(id int,name varchar(30)); #插入测试数据 insert into test02(id,name)values(1,'hudi'); insert into test02(id,name)values(2,'xiaohong'); insert into test02(id,name)values(3,'xiaolan'); quit exit
|
编写一个test.py文件,去读取test02表的数据。内容如下。
在执行测试脚本前,要用uv工具安装Python连接mysql的包,uv pip install mysql.connector
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
| import mysql.connector
config = { 'user': 'root', 'password': '123456', 'host': 'localhost', 'database': 'test02', 'raise_on_warnings': True }
cnx = mysql.connector.connect(**config)
cursor = cnx.cursor()
query = "SELECT * FROM test02" cursor.execute(query)
for row in cursor: print(row)
cursor.close() cnx.close()
|
在test.py中右击,【Run Python】->【Run Python File In Terminal】就可以运行Python程序了,测试结果如下图。

再修改完代码后记得在终端中去提交代码。这里仅测试mysql,redis就不测试了😄。
在完成上述操作以后,可以将构建的Python开发环境去打包成一个镜像,命令同上面的一样。构建好以后,在.cnb.yml可以直接指定镜像名称,这样启动时就省去了构建系统镜像的时间。
文章演示的这个Python开发环境这里构建了一个镜像,地址:https://cnb.cool/hudi22/python_dev/-/packages/docker/python_dev/ubuntu 。 测试代码上面也有,或者直接看代码仓库。在.cnb.yml中直接指定镜像名字和版本就能直接使用Mysql和Redis服务了。感兴趣的朋友👭可以去试试。其次就是这个环境只做测试使用,你们可以根据自己的开发习惯定义属于自己的云开发集成环境。后面在写关于服务端口转发和环境变量的内容吧。
另外在哔哔一下,就是CNB官方还提供了一些示例,有需要的朋友可以看这个连接:https://cnb.cool/examples/showcase 。