linux上可自制50mb以内scratch 3.x最小镜像:克隆官方仓库构建静态资源,用miniserve托管,alpine多阶段dockerfile精简打包,仅含node.js运行时、静态文件和单二进制web服务。

在 Linux 上自制最小化 Scratch 基础镜像并部署,核心是:不依赖官方 Docker 镜像、精简运行时、仅保留 Scratch 3.x 运行必需组件(Node.js + 静态资源)、用轻量 Web 服务托管、支持容器化部署。整个过程可控制在 50MB 以内镜像体积。
准备 Scratch 3.x 静态资源
Scratch 3 是纯前端应用,无需后端逻辑即可运行(离线模式)。官方已开源全部静态文件:
- 克隆官方仓库:
git clone https://github.com/LLK/scratch-gui.git - 进入目录执行构建:
npm install && npm run build(需 Node.js 16+ 和 npm) - 构建产物位于
build/目录,包含index.html、main.js、vendor.js等,即完整可运行的单页应用 - 可选裁剪:删除
build/locales/中非必需语言包,或用rm -rf build/locales/{de,fr,ja,...}减小体积
选择极简 Web 服务并打包
不用 nginx 或 Apache,改用零配置、单二进制、内存占用低的静态服务器:
- 推荐 esbuild-serve(基于 esbuild 的超轻量服务)或更通用的 miniserve
- 以 miniserve 为例(Rust 编写,单文件二进制,~3MB):
下载对应平台版本(如miniserve-x86_64-unknown-linux-musl),重命名为serve,放入项目根目录 - Dockerfile 中直接
COPY serve /usr/local/bin/,无需安装依赖 - 启动命令只需:
serve --port 80 --no-cors --no-directory-listing /usr/share/scratch
编写多阶段 Dockerfile(Alpine 基础)
用 Alpine Linux + musl + 多阶段构建,确保最终镜像干净无构建残留:
FROM node:18-alpine AS builder WORKDIR /app COPY package*.json ./ RUN npm ci --only=production COPY . . RUN npm run build FROM alpine:3.19 RUN apk add --no-cache ca-certificates WORKDIR /usr/share/scratch COPY --from=builder /app/build/ . COPY serve /usr/local/bin/ EXPOSE 80 CMD ["serve", "--port", "80", "--no-cors", "--no-directory-listing", "."]
- 第一阶段用 Node Alpine 构建,第二阶段只复制
build/和serve二进制 - 最终镜像大小约 42–48MB(取决于是否清理 locales)
- 不安装 bash、curl、wget 等非必需工具,保持最小攻击面
部署与验证
构建并运行后,可通过浏览器访问确认功能完整性:
- 构建镜像:
docker build -t scratch-minimal . - 运行容器:
docker run -d -p 8080:80 --name scratch scratch-minimal - 打开
http://localhost:8080—— 应看到 Scratch 启动页,可新建项目、添加角色、运行脚本 - 如需持久化项目(保存 .sb3),需挂载卷到
/usr/share/scratch/projects并改造前端读写逻辑(默认为纯前端 localStorage,刷新即丢)











