logo
0
0
WeChat Login

基于 archlinux 构建的编程开发环境

这是给 CNB云开发环境 用的容器镜像,基础镜像基于 Arch Linux。

项目背景

云平台提供的系统镜像大多面向服务器,软件版本保守;开发环境却需要更新工具链。 CNB云开发环境支持远程容器开发,本项目维护一套分层构建的 dockerfile,用于产出可在 CNB 直接使用的 Arch Linux 开发镜像。

项目特点

  • 分层构建:starter → 地基,sideway → 旁路编译,trunkway → 最终镜像,做了点小小的缓存复用工作
  • 国内加速:尽量国内镜像源,加速构建
  • 多语言内置:python / go / node 开箱即用
  • 工具脚本化:把常用的安装、下载、配置操作封装成 tool/ 下的小脚本,dockerfile 里直接调用,简洁明了
  • 配置即代码:dotfile/ 目录集中管理所有配置文件,构建时一键复制进镜像
  • 远程开发随心选:VSCode / CodeBuddy 装个 Remote-SSH 插件就能连;也支持一键拉起 WebIDE(code-server 4.117.0)直接网页写代码;终端党 ssh 进来用 nvim/helix/vim 凑合用

环境要求

  • Docker;或 Podman + Buildah 组合;或者其他兼容 docker build 命令的构建环境
  • Git
  • Bash
  • 20 GB 以上磁盘空间
  • 可访问公网镜像源

项目结构

./
├── starter/      # 地基:换国内源,装基础包和编译工具
├── sideway/      # 旁路:下源码编东西,产出文件在镜像里边,给主链路 COPY --from
├── trunkway/     # 主干道:集成环境,出最终镜像,能在 CNB云开发环境 直接用
├── tool/         # 工具脚本:封装常用的安装、下载、配置操作
├── dotfile/      # 配置文件:各种开发工具的配置文件,构建时拷贝进镜像
├── buildimg.sh   # 镜像构建脚本
└── mock.sh       # 顶层构建控制(构建所有组件)

目录详细说明

  • starter/:基础起点层,所有构建流程的起点

    • 换国内镜像源
    • 安装基础软件、系统工具、开发环境、辅助工具
    • 准备好 tool/ 下的脚本供后续步骤使用
  • sideway/:解耦组件层,耗时长且更新不频繁的步骤

    • code-server.dockerfile:构建 code-server(VS Code Web版,4.117.0)
    • dumb-init.dockerfile:构建 dumb-init(进程管理)
  • trunkway/:主干整合层,最终产出可运行的容器镜像

    • 安装 golang(通过 tool/download_golang.sh
    • 配置 nodejs / npm
    • 配置 sshd
    • 配置 git(使用 delta 作为 pager)
    • 配置 ohmyzsh
    • 拷贝 dotfile/ 到镜像
  • tool/:工具脚本目录

    • pkg_install.sh:封装 pacman 安装命令,自动重试
    • download_golang.sh:下载安装指定版本的 golang
    • build_python.sh:源码编译安装指定版本的 python
    • wget_download.sh:封装 wget 下载,支持多个镜像源重试
    • set_sshd.sh:修改 sshd 配置
    • add_ssh_key.sh:添加 SSH 密钥
    • npm_install.sh:npm 安装封装
    • cnbrcode.sh:CNB 环境相关配置(欢迎信息、别名等)
  • dotfile/:配置文件目录

    • root/.vimrc:Vim 配置
    • root/.config/nvim/init.lua:Neovim 配置
    • root/.config/helix/config.toml:Helix 配置
    • root/.zshrc:Zsh 配置
    • root/.tmux.conf:Tmux 配置
    • root/.screenrc:Screen 配置
    • root/.config/pip/pip.conf:Pip 配置
    • root/.commonshrc:公共 shell 配置
    • etc/profile.d/add_path.sh:路径配置

构建流程

流水线构建

项目根目录已放好 .cnb.yml,推送 main 分支即触发 CNB 自动构建,默认只重新构建有变动的 dockerfile。

构建顺序:starter → sideway(并行)→ trunkway

触发条件

  • 项目根目录 .citrigger 更新 → 触发全部 dockerfile 重新构建
  • starter/sideway/trunkway/ 子目录下的 .citrigger 更新 → 仅触发该子目录内所有 dockerfile 重新构建
  • Markdown 文件(.md)的变更不会触发构建

本地手动构建

# 起个名字,不填默认 localhost/cnbdev
export ProjImageName=my-archl

# 构建基础层
./buildimg.sh starter

# 构建旁路组件(可并行)
./buildimg.sh sideway

# 构建最终镜像
./buildimg.sh trunkway

本地构建单个文件

# 构建单个 dockerfile
./buildimg.sh sideway/code-server.dockerfile
./buildimg.sh sideway/dumb-init.dockerfile

构建并推送到仓库

# 设置镜像名称
export ProjImageName="docker.cnb.cool/squorm/cnb-ydev-archl"

# 构建并推送
push=1 ./buildimg.sh starter
push=1 ./buildimg.sh sideway
push=1 ./buildimg.sh trunkway

构建所有组件

./mock.sh all

内置开发环境

编程语言

  • Python:系统 python + pip(starter 层通过 pacman 安装)
  • Golang:通过 download_golang.sh 安装(trunkway 层)
  • Node.js:通过 npm 安装包(trunkway 层通过 pacman 安装)

编辑器 / IDE

  • code-server:4.117.0(VS Code 的 Web 版)
  • Vim / Neovim:终端编辑器
  • Helix:现代化终端编辑器

终端与 Shell

  • Zsh + Oh My Zsh:默认 shell
  • Tmux:终端复用器
  • Screen:另一个终端复用器

多语言版本管理

Golang

trunkway/final.dockerfile 中使用 tool/download_golang.sh 安装:

RUN /tool/download_golang.sh 1.26.2

脚本会自动:

  • 从腾讯云/阿里云镜像源下载指定版本的 golang
  • 安装到 /opt/golang/<version>/(同时软链接到 /opt/golang/latest
  • 配置好 GOPATH、GOROOT、GOPROXY 等环境变量
  • 生成环境配置到 /etc/profile.d/mygoenv.sh

如需多个 Go 版本并存,在 dockerfile 中多次调用即可,每次调用会在 /opt/golang/<version>/ 安装独立版本,latest 软链接指向最后安装的版本。

Python 多版本(备用)

当前镜像中未启用tool/build_python.sh 脚本已就绪,可根据需要手动启用。

该脚本支持从源码编译安装指定版本的 Python:

/tool/build_python.sh 3.11.9   # 安装 Python 3.11.9
/tool/build_python.sh 3.13.1   # 安装 Python 3.13.1
/tool/build_python.sh 2.7.18   # 安装 Python 2.7.18

脚本会自动:

  • 从阿里云镜像源下载 Python 源码
  • 使用 clang + lld 编译
  • 安装到 /opt/extrapy/<version>/
  • 安装 pip 和常用包(six, requests, PyYAML)
  • 自动配置 PATH(通过 /etc/profile.d/extrapy.sh

注意:Python 从源码编译耗时较长,建议在 sideway 层执行。

Node.js

trunkway/final.dockerfile 中使用 pacman 安装:

RUN /tool/pkg_install.sh nodejs npm

开发工具配置

配置文件统一放在 dotfile/ 目录,构建时会自动拷贝进镜像:

  • 编辑器:vim、neovim、helix 都配好了基础配置
  • 终端:zsh(ohmyzsh)、tmux、screen 开箱即用
  • git:配置了 delta 作为 pager,侧边显示,带行号
  • pip:使用腾讯云镜像源加速

使用说明

在 CNB云开发环境中使用

  1. 把构建完的镜像推到 CNB 仓库
  2. 在项目根目录新建 .cnb.yml
$:
  vscode:
    - runner:
        cpus: 4
      docker:
        image: docker.cnb.cool/squorm/cnb-ydev-archl:latest  # 我构建的,可直接用,也可换成你自己的镜像地址
      services:
        - vscode
        - docker
      env:
        CNB_WELCOME_CMD: "/tool/cnbrcode.sh"
      stages:
        - name: cnb-welcome
          script: "timeout 30 code-server --install-extension cnbcool.cnb-welcome || :"
  1. 推送 main 分支后,在代码仓库页面点橙色「云原生开发」按钮即可拉起 workspace

官方文档戳这里:CNB 云开发环境文档

本地测试镜像

# 启动容器测试
docker run -it --rm docker.cnb.cool/squorm/cnb-ydev-archl:latest /bin/zsh

# 测试 python
docker run -it --rm docker.cnb.cool/squorm/cnb-ydev-archl:latest /bin/bash -c 'python3 --version'

# 测试 golang
docker run -it --rm docker.cnb.cool/squorm/cnb-ydev-archl:latest go version

# 测试 nodejs
docker run -it --rm docker.cnb.cool/squorm/cnb-ydev-archl:latest node --version

# 测试 code-server
docker run -it --rm -p 8080:8080 docker.cnb.cool/squorm/cnb-ydev-archl:latest code-server --version

注意事项

  • 构建失败 99% 网络抽风,重试即可
  • Arch 更新快,底层依赖随时可能变动,构建炸了先清缓存再试
  • 语言版本按需锁死,要新版自己改 dockerfile 或工具脚本
  • tool/build_python.sh 从源码编译,耗时较长,建议在 sideway 层处理
  • 别在生产机裸跑,炸了自行背锅
  • Markdown 文件(.md)变更不会触发 CI/CD 构建

懒人直接拿

镜像已推 docker.cnb.cool/squorm/cnb-ydev-archl:latest,latest 即最新,直接引用即可。

About

cnb开发环境容器镜像, 基于archlinux.

Language
Shell53.8%
Dockerfile36.4%
Lua8.7%
Others1.1%