Skip to content
50.代码托管与部署»30.CNB»20.云原生开发»LV010-自定义开发环境.md

LV010-自定义开发环境

官方文档中已经说明,默认环境镜像为cnbcool/default-dev-env:latest

  • 包含软件:git rsync jq git-lfs vim curl wget unzip lsof nload htop net-tools dnsutils openssh-server

  • vscode插件: coding-copilot vscode-yaml githistory gitblame git-graph vscode-yaml live-server

但是对于我来说,其实是不够用的,我还希望可以安装gcc、make、cmake等嵌入式开发常用的工具,这个时候我们也是可以自定义开发环境的。

参考:自定义开发环境 | CNB 文档

一、通过 docker 镜像指定开发环境

可以通过在 .cnb.yml 编写远程开发事件流水线,并指定pipeline.docker.image 指定开发环境镜像。

yaml
# .cnb.yml
$:
  vscode:
    - docker:
        # 指定开发环境镜像,可以是任意可访问的镜像。
        # 如果 image 指定的镜像中已安装 code-server 代码服务,将使用单容器模式启动开发环境
        # 如果 image 指定的镜像中未安装 code-server 代码服务,将使用双容器模式启动开发环境
        # 如下镜像为 CNB 默认开发环境镜像,已安装代码服务,将使用单容器模式启动开发环境
        # 可按需替换为其他镜像
        image: cnbcool/default-dev-env:latest
      services:
        - vscode
        - docker
      # 开发环境启动后会执行的任务
      stages:
        - name: 查看当前路径下文件
          script:
            - echo "当前路径为 $(pwd)"
            - ls -al

.cnb.yml 文件中的 script 部分可以运行多个命令。可以通过以下几种方式实现:

  • 多行命令:直接在 script 下以多行的形式列出多个命令,每个命令占一行。

  • 使用 &&; :将多个命令通过 && (前一个命令成功才执行下一个)或 ; (无论前一个命令是否成功都执行下一个)连接起来。

然后我们关闭开发环境重新启动开发环境,我们可以在【云原生构建】这里看到启动流程:

image-20250930192034482

之前启动的流程也都在这里,这个就是准备开发环境的流水线,我们可以进去看一下:

image-20250930192819444

会看到命令都执行了。

二、通过 Dockerfile 自定义开发环境

我们还可以可以自行编写 Dockerfile 来自定义开发环境。在仓库根目录下增加 .ide/Dockerfile 文件,在 Dockerfile 中自由定制开发环境。

如果未自定义启动流水线,启动开发环境时使用默认流水线创建开发环境。 默认流水线会优先使用 .ide/Dockerfile 构建一个镜像,作为开发环境基础镜像。

注意:启动开发环境的默认流水线中,同时配置了 默认镜像.ide/Dockerfile, 如果 .ide/Dockerfile 不存在或构建失败,会使用 默认镜像 作为开发环境基础镜像。 如果遇到启动的环境不符合预期,可以查看构建日志 prepare 阶段 .ide/Dockerfile 是否构建成功。

我们定义一个Dockerfile,使用cnbcool/default-dev-env:latest作为基础镜像,然后里面安装一下gcc、make、cmake等命令:

dockerfile
FROM cnbcool/default-dev-env:latest

# 安装 gcc, make, cmake
RUN apt-get update && apt-get install -y \
    gcc \
    make \
    cmake \
    && rm -rf /var/lib/apt/lists/*

然当然其实也可以在前面的.cnb.yml文件的script中添加apt-get命令来安装所需命令,但是这里还是学习一下自定义Dockerfile。然后我们提交,重新开启云原生开发,看一下环境中是否有这些命令:

image-20250930194824358

显然失败了,这是为什么?我们的 .cnb.yml 中的 image 字段指向一个已经存在的镜像,这个时候构建工具会直接使用该镜像,那么 .ide/Dockerfile 中的内容将不会生效。这个时候我们可以选择注释掉image字段,或者采用同时定义开发环境和启动流程的方式,直接将.cnb.yml修改为以下内容:

yaml
# .cnb.yml
$:
  vscode:
    - docker:
        # 指定开发环境镜像,可以是任意可访问的镜像。
        # 如果 image 指定的镜像中已安装 code-server 代码服务,将使用单容器模式启动开发环境
        # 如果 image 指定的镜像中未安装 code-server 代码服务,将使用双容器模式启动开发环境
        # 如下镜像为 CNB 默认开发环境镜像,已安装代码服务,将使用单容器模式启动开发环境
        # 可按需替换为其他镜像
        # image: cnbcool/default-dev-env:latest
        build: .ide/Dockerfile
      services:
        - vscode
        - docker
      # 开发环境启动后会执行的任务
      stages:
        - name: 查看当前路径下文件
          script:
            - echo "当前路径为 $(pwd)"
            - ls -al

然后我们看一下构建日志 prepare 阶段,就会发现这里确实开始安装这些命令了:

image-20250930195341902

然后启动成功后,查看各个软件版本信息:

bash
  /workspace git:(main) gcc --version
gcc (Debian 12.2.0-14+deb12u1) 12.2.0
Copyright (C) 2022 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

  /workspace git:(main) make --version
GNU Make 4.3
Built for x86_64-pc-linux-gnu
Copyright (C) 1988-2020 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
  /workspace git:(main) cmake --version
cmake version 3.25.1

CMake suite maintained and supported by Kitware (kitware.com/cmake).

会发现命令都是已安装好的了。

莫道桑榆晚 为霞尚满天.