环境准备:Python、Go、Node.js 与 Docker 的搭建
说实话,环境搭建这事儿,看着简单,但坑是真不少。我见过太多人卡在第一步——不是版本冲突,就是路径不对,折腾半天连个 hello world 都跑不起来。这一章,咱们就把四个核心环境一次性捋清楚。
你想想看,SBOM 生成工具覆盖了主流语言生态:Python 的 pip-audit、Go 的 syft、Node.js 的 npm audit,还有 Docker 镜像扫描。哪个环境出问题,后面的实战都白搭。所以,咱们一步到位。
核心原则:版本锁定 + 隔离管理。别用系统自带的 Python 或 Node,也别一股脑装最新版。生产环境讲究的是可复现。
3.1 Python 环境搭建
Python 是我用得最多的语言。我个人习惯用 pyenv 管理多版本,而不是直接装系统级 Python。为什么?因为项目 A 可能依赖 Python 3.8,项目 B 要 3.11,你总不能来回卸载重装吧?
3.1.1 安装 pyenv
# macOS / Linux
curl https://pyenv.run | bash
# 然后配置 shell 环境
echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.bashrc
echo 'command -v pyenv >/dev/null || export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.bashrc
echo 'eval "$(pyenv init -)"' >> ~/.bashrc
source ~/.bashrc
Windows 用户可以用 pyenv-win,或者直接用 Anaconda。不过我个人更推荐 WSL2 + pyenv 的组合,体验跟 Linux 几乎一样。
3.1.2 安装指定版本
# 查看可安装版本
pyenv install --list
# 安装 Python 3.10.12(SBOM 工具常用版本)
pyenv install 3.10.12
# 设置全局版本
pyenv global 3.10.12
# 验证
python --version
小技巧:安装慢的话,可以设置镜像源。我曾经在内网环境折腾了一下午,最后发现是网络问题。export PYTHON_BUILD_MIRROR_URL 能救急。
3.1.3 虚拟环境
每个项目都应该有自己的虚拟环境。我习惯用 venv,轻量且内置。
# 创建虚拟环境
python -m venv sbom-env
# 激活
source sbom-env/bin/activate # Linux/macOS
# sbom-env\Scripts\activate # Windows
# 安装 SBOM 相关工具
pip install cyclonedx-bom
pip install pip-audit
注意:别用 sudo pip install!我曾经手滑一次,把系统 Python 搞崩了,重装了系统才恢复。虚拟环境里随便折腾,出错了直接删掉重来。
3.2 Go 语言环境搭建
Go 的安装比 Python 简单得多。但有个坑——GOPATH 和 Go Modules 的切换。我记得刚开始用 Go 1.16 时,还被 GOPATH 模式坑过几次。
3.2.1 安装 Go
# 下载最新稳定版(以 1.22 为例)
wget https://go.dev/dl/go1.22.0.linux-amd64.tar.gz
# 解压到 /usr/local
sudo tar -C /usr/local -xzf go1.22.0.linux-amd64.tar.gz
# 配置环境变量
echo 'export PATH=$PATH:/usr/local/go/bin' >> ~/.bashrc
echo 'export GOPATH=$HOME/go' >> ~/.bashrc
echo 'export PATH=$PATH:$GOPATH/bin' >> ~/.bashrc
source ~/.bashrc
# 验证
go version
3.2.2 Go Modules 配置
从 Go 1.16 开始,Modules 是默认模式。我建议你直接开启,别回头用 GOPATH。
# 设置代理(国内必备)
go env -w GOPROXY=https://goproxy.cn,direct
# 创建项目
mkdir sbom-tools && cd sbom-tools
go mod init sbom-tools
# 安装 syft(SBOM 生成工具)
go install github.com/anchore/syft/cmd/syft@latest
为什么用 Go?SBOM 领域很多核心工具(syft、grype、trivy)都是 Go 写的。Go 的静态编译特性让这些工具部署起来特别方便——一个二进制文件,扔哪都能跑。
3.3 Node.js 环境搭建
Node.js 的版本管理,我推荐 nvm。npm 的依赖树有时候能绕晕你,但 nvm 至少能保证版本不乱。
3.3.1 安装 nvm
# 安装 nvm
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.7/install.sh | bash
# 重新加载 shell
source ~/.bashrc
# 安装 Node.js LTS 版本
nvm install --lts
# 使用指定版本
nvm use 20.11.0
# 验证
node --version
npm --version
3.3.2 配置 npm 镜像
国内用户一定要配镜像,不然 npm install 能等到你怀疑人生。
# 设置淘宝镜像
npm config set registry https://registry.npmmirror.com
# 验证
npm config get registry
3.3.3 安装 SBOM 相关工具
# 全局安装 npm-audit 相关工具
npm install -g @cyclonedx/bom
npm install -g npm-audit
# 或者用 npx 临时运行(推荐)
npx @cyclonedx/bom --help
避坑指南:我曾经在 CI 环境里用全局安装,结果不同项目依赖冲突。后来改用 npx 或者项目级 devDependencies,再也没出过问题。
3.4 Docker 环境配置
Docker 是 SBOM 扫描的重头戏。容器镜像的依赖清单,全靠 Docker 环境来拉取和分析。
3.4.1 安装 Docker Engine
# Ubuntu / Debian
sudo apt-get update
sudo apt-get install docker-ce docker-ce-cli containerd.io
# 启动 Docker
sudo systemctl start docker
sudo systemctl enable docker
# 将当前用户加入 docker 组(避免每次 sudo)
sudo usermod -aG docker $USER
# 重新登录生效
3.4.2 配置镜像加速
Docker Hub 在国内访问极慢。我建议你配好镜像加速器,不然拉个基础镜像都要半小时。
# 编辑 /etc/docker/daemon.json
{
"registry-mirrors": [
"https://docker.mirrors.ustc.edu.cn",
"https://hub-mirror.c.163.com"
],
"log-driver": "json-file",
"log-opts": {
"max-size": "10m",
"max-file": "3"
}
}
# 重启 Docker
sudo systemctl daemon-reload
sudo systemctl restart docker
3.4.3 验证 Docker 环境
# 运行测试容器
docker run hello-world
# 查看版本
docker --version
docker compose version
安全提醒:别把 Docker 的 socket 暴露给不信任的容器。我曾经见过一个案例,攻击者通过挂载 /var/run/docker.sock 逃逸到宿主机。生产环境一定要限制容器权限。
3.5 环境验证清单
所有环境装完后,我习惯跑一遍验证脚本。确保每个工具都能正常工作,后面实战才不会卡壳。
| 工具 | 验证命令 | 预期输出 |
|---|---|---|
| Python | python --version |
Python 3.10.x |
| pip | pip --version |
pip 23.x from ... |
| Go | go version |
go 1.22.x |
| Node.js | node --version |
v20.x.x |
| npm | npm --version |
10.x.x |
| Docker | docker --version |
Docker version 25.x |
| syft | syft --version |
syft 1.x.x |
| cyclonedx-bom | cyclonedx-bom --version |
3.x.x |
3.6 环境架构总览
下面这张图,把四个环境的关系和工具链串起来了。你照着搭,不会错。
嗯,到这里,四个环境就全搭好了。你可能会问:「这么多工具,会不会冲突?」放心,Python 有虚拟环境,Node 有 nvm 隔离,Go 是静态编译,Docker 跑在容器里——它们各玩各的,互不干扰。