大冬の小站

03 CNB云原生开发

2025/11/09
5
0

CNB 云原生开发介绍

基于云原生构建的远程开发解决方案,支持通过 WebIDE、VSCode 客户端、Cursor 客户端连接远程开发环境进行远程开发。

参考文档:云原生开发介绍

一、使用方式

在仓库分支页面,点击右上角 云原生开发 按钮,一键创建开发环境, 无需任何配置,即可直接打开一个默认的开发环境。当然这个默认环境并不是永久有效的,具体可参考远程开发工作区回收机制

端口转发https://docs.cnb.cool/zh/workspaces/business-preview.html

启动 nginx 镜像

docker run -d --name dd-nginx -p 80:80 nginx

启动 redis 镜像

docker run -d --name dd-redis -p 6379:6379 -e REDIS_PASSWORD=123456 redis redis-server --requirepass 123456

二、实战一(自定义系统镜像)

你将学习到的知识点包括:

  • 1️⃣自定义系统镜像编写

  • 2️⃣自定义开发环境编写

  • 3️⃣自定义镜像仓库推送

  • 4️⃣镜像的查找

  • 5️⃣自定义云开发环境CPU核数

1 基础案例

如果你希望使用自定义系统镜像(例如添加 java、node、python、Go环境等等),而不使用默认镜像,则需要你在仓库的根目录下创建一个名为.cnb.yml 的配置文件,并填写如下内容:

$:
  # vscode 事件:专供页面中启动远程开发用
  vscode:
    - docker:
        # 自定义镜像作为开发环境
        image: ubuntu:25.04
      services:
        - vscode
        - docker

镜像如何查找,可以通过dockerhub进行查找,也可以用轩辕镜像 DockerHub 搜索毫秒镜像进行镜像查找

现在点击云原生开发,会出现以下界面代表正在启动中,其中在环境创建中... 后面有个倒计时,代表距离系统创建还差多长时间完成。一般环境都会在10秒之内创建完成。在下面还有对应创建的日志,可以看在启动过程中有没有报错。

启动成功后自动跳转WebIDE界面中,其中环境配置下方则提示你使用的cpu核数、内存、以及快速关闭和自动回收♻️机制。

自定义CPU核数

编辑仓库根目录下的.cnb.yml配置runner.cpus 声明需要的开发资源,最大支持 64核,内存为 cpus x 2(GB)。

云原生开发环境核数计费详见:CNB计费模式

$:
  # vscode 事件:专供页面中启动远程开发用
  vscode:
    - docker:
        # 自定义镜像作为开发环境
        image: ubuntu:25.04
      runner:
        cpus: 2
      services:
        - vscode
        - docker
      # 开发环境启动后会执行的任务
      stages:
        - name: ls
          script: ls -al

重新启动环境,可以很明显的看到环境配置已经变成2核 4G内存

20250708222408

远程开发

通过cat /etc/os-release指令查看操作系统是否是我们指定的镜像版本

20250708220425

这是我们点击自己头像中的我的云原生开发,会发现当前云原生开发环境只支持WebIDE,这是不符合我们预期的

20250708222742

2 进阶案例

在基础案例中我们使用了自定义镜像,但是这个镜像只支持WebIDE,如果想要支持ssh则需要安装自定义dockerfile并添加openssh-server服务。 添加Dockerfile文件到仓库根目录,并添加如下内容:

FROM ubuntu:25.04

RUN apt-get update && \
    apt-get install -y git rsync jq git-lfs vim curl wget unzip lsof nload htop net-tools dnsutils openssh-server && \
    apt-get clean && \
    rm -rf /var/lib/apt/lists/*

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

# 指定字符集支持命令行输入中文(根据需要选择字符集)
ENV LANG C.UTF-8
ENV LANGUAGE C.UTF-8

我们进行镜像构建、推送

# 镜像构建
docker build -t docker.cnb.cool/dadong.cnb/test/test/ubuntu:25.04 .

# 镜像推送
docker push docker.cnb.cool/dadong.cnb/test/test/ubuntu:25.04

推送成功后,我们将会在本仓库的制品中看到我们刚刚推送的镜像

20250708223939

修改.cnb.yml文件,添加我们刚刚推送的镜像

$:
  # vscode 事件:专供页面中启动远程开发用
  vscode:
    - docker:
        # 自定义镜像作为开发环境
        image: docker.cnb.cool/dadong.cnb/test/test/ubuntu:25.04
      runner:
        cpus: 2
      services:
        - vscode
        - docker
      # 开发环境启动后会执行的任务
      stages:
        - name: ls
          script: ls -al

重新启动环境,并打开我的云原生开发界面,发现已有WebIDE,VSCode,Cursor,SSH选项

20250710094619
自定义开发环境

这里以自定义go语言环境为例

go语言开发环境有2种方式,第一种最简单在dockerfile文件中添加 apt install -y go 命令安装,第二种采用在Dockerfile中添加 RUN 命令下载二进制进行安装

FROM ubuntu:25.04

RUN apt-get update && \
    apt-get install -y git rsync jq git-lfs vim curl wget unzip lsof nload htop net-tools dnsutils openssh-server && \
    apt-get clean && \
    rm -rf /var/lib/apt/lists/*

# 设置工作目录(可选)
WORKDIR /workspace

RUN curl -fsSLO https://go.dev/dl/go1.24.5.linux-amd64.tar.gz &&\
    rm -rf /usr/local/go && tar -C /usr/local -xzf go1.24.5.linux-amd64.tar.gz &&\
    ln -sf /usr/local/go/bin/go /usr/bin/go && \
    rm -rf go1.24.5.linux-amd64.tar.gz

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

# 指定字符集支持命令行输入中文(根据需要选择字符集)
ENV LANG C.UTF-8
ENV LANGUAGE C.UTF-8

执行镜像构建、推送,关闭当前云开发环境并重新启动,输入go version 查看是否安装成功

参考材料

三、实战二(n8n中文版一键启动)

n8n 地址https://github.com/n8n-io/n8n

n8n 中文插件地址https://github.com/other-blowsnow/n8n-i18n-chinese

1 docker-compose编写

services:
  n8n:
    image: n8nio/n8n:1.104.2
    container_name: n8n
    ports:
      - "5678:5678"
    environment:
      - N8N_DEFAULT_LOCALE=zh-CN
      - N8N_SECURE_COOKIE=false
    volumes:
      - ./dist:/usr/local/lib/node_modules/n8n/node_modules/n8n-editor-ui/dist
      - ./n8n_data:/home/node/.n8n
    restart: always

2 CNB YML文件编写

$:
  vscode:
    - services:
        - vscode
        - docker
      # 开发环境启动后会执行的任务
      env:
      # 配置环境变量,指定首次打开终端时自动执行的命令
        CNB_WELCOME_CMD: |
          chmod -R 777 n8n_data
          docker compose up -d

四、实战三(一键启动dify)

你将学习到的知识点包括:

  • 1️⃣ dify一键启动

  • 2️⃣ dify持久化存储

  • 3️⃣自定义环境销毁前任务

  • 4️⃣python脚本的编写

1 基础案例

githubhttps://github.com/langgenius/dify

准备代码dify-1.5.1

20250710112007

先编写启动的python脚本: start.py

注意:脚本执行需传入相应的port,例如:python start.py 8080

import webbrowser
import os
import sys

port = sys.argv[1]
original_uri = os.getenv("CNB_VSCODE_PROXY_URI")
appurl = original_uri.replace("{{port}}", port)

print("欢迎欢迎,热烈欢迎!")
print("欢迎使用 Dify 环境!")
print(f'\tdify环境访问:')
print(f"\t - http://localhost:{port}")
print(f"\t - {appurl}")
webbrowser.open_new_tab(appurl)

print("1. 如果没有自动打开界面,请检查一下你的浏览器,是否阻止了弹出式窗口")
print("2. 如果还未打开界面,请手动点击port为80端口后面的小地球开始吧~")

配置cnb云原生开发点击自动运行,无需手动在点击一次

新建 .cnb/setting.yml 文件,并填写以下内容:

workspace:
  launch:
    # 自动打开webIde
    autoOpenWebIDE: true

编写.cnb.yml文件

$:
  vscode:
  - docker:
      image: docker.cnb.cool/dadong.cnb/cloud/os/ubuntu:25.04
    env:
      # 配置环境变量,指定首次打开终端时自动执行的命令
      CNB_WELCOME_CMD: |
        cd docker
        docker-compose up -d
        python ../start.py 80
    services:
      - vscode
      - docker

2 进阶案例

在基础案例中已经实现基于CNB一键启动dify,接下来我们来实现基于CNB持久化存储dify的数据,以及自定义环境销毁前任务。

  1. 注释.gitignore文件中关于docker/volumes/*目录的内容,并执行git add . git commit -m "add" git push

  2. 启动云原生开发环境,会基于我们基础案例自动进入docker目录,执行docker compose up -d指令

  3. 修改云原生开发环境中的.cnb.yml文件,添加以下内容:

$:
  vscode:
  - docker:
      image: docker.cnb.cool/dadong.cnb/cloud/os/ubuntu:25.04
    env:
      # 配置环境变量,指定首次打开终端时自动执行的命令
      CNB_WELCOME_CMD: |
        cd docker
        mkdir -p volumes/db/data/pgdata/pg_notify volumes/db/data/pgdata/pg_tblspc volumes/db/data/pgdata/pg_replslot volumes/db/data/pgdata/pg_twophase volumes/db/data/pgdata/pg_commit_ts volumes/db/data/pgdata/pg_logical/{snapshots,mappings}
        chown -R 70:70 volumes/db/data
        docker compose up -d
        python ../start.py 80
    services:
      - vscode
      - docker

    # 开发环境销毁前会执行该任务
    endStages:
      - name: sync code
        script: git add . && git commit -m "自动提交:$(date '+%Y-%m-%d %H:%M:%S')" && git push
  1. 关闭云原生开发环境,等待流水线启动完成,之后项目的重启就会自动持久化数据

参考材料