Simple script and config (type-safe) for building custom Linux kernels for Firecracker MicroVMs

feat: add Docker support and update README for Docker usage

+46 -1
+4
.dockerignore
···
··· 1 + linux-stable 2 + vmlinux-builder 3 + .config 4 + .config.toml
+27
Dockerfile
···
··· 1 + FROM denoland/deno:latest 2 + 3 + RUN apt-get update 4 + 5 + RUN apt-get install -y \ 6 + git \ 7 + build-essential \ 8 + flex \ 9 + bison \ 10 + libncurses5-dev \ 11 + libssl-dev \ 12 + gcc \ 13 + bc \ 14 + libelf-dev \ 15 + pahole 16 + 17 + WORKDIR /app 18 + 19 + COPY deno.json deno.json 20 + 21 + COPY deno.lock deno.lock 22 + 23 + RUN deno install 24 + 25 + COPY . . 26 + 27 + ENTRYPOINT ["./build.ts"]
+6
README.md
··· 44 deno run -A jsr:@tsiry/vmlinux-builder 6.17.7 45 ``` 46 47 ### Supported Version Formats 48 49 - `6.1` - Major.Minor version
··· 44 deno run -A jsr:@tsiry/vmlinux-builder 6.17.7 45 ``` 46 47 + Or with docker: 48 + 49 + ```bash 50 + docker run --rm -it -v $(pwd):/app tsiry/vmlinux-builder:latest 6.17.7 51 + ``` 52 + 53 ### Supported Version Formats 54 55 - `6.1` - Major.Minor version
+3 -1
build.ts
··· 1 #!/usr/bin/env -S deno run --allow-run --allow-read --allow-write --allow-env --allow-net 2 import chalk from "chalk"; 3 import cfg from "./default-config.ts"; 4 ··· 78 console.log(`Building vmlinux for Linux kernel ${chalk.cyan(NUM)}`); 79 80 const hasAptGet = await runQuiet(["which", "apt-get"]); 81 if (hasAptGet) { 82 try { 83 await run([ 84 - "sudo", 85 "apt-get", 86 "install", 87 "-y",
··· 1 #!/usr/bin/env -S deno run --allow-run --allow-read --allow-write --allow-env --allow-net 2 + import _ from "@es-toolkit/es-toolkit/compat"; 3 import chalk from "chalk"; 4 import cfg from "./default-config.ts"; 5 ··· 79 console.log(`Building vmlinux for Linux kernel ${chalk.cyan(NUM)}`); 80 81 const hasAptGet = await runQuiet(["which", "apt-get"]); 82 + const hasSudo = await runQuiet(["which", "sudo"]); 83 if (hasAptGet) { 84 try { 85 await run([ 86 + ..._.compact([hasSudo ? "sudo" : null]), 87 "apt-get", 88 "install", 89 "-y",
+1
deno.json
··· 7 "build": "deno compile --allow-net --allow-read --allow-write --allow-env -o vmlinux-builder ./build.ts" 8 }, 9 "imports": { 10 "@std/assert": "jsr:@std/assert@^1.0.15", 11 "@std/toml": "jsr:@std/toml@^1.0.11", 12 "@zod/zod": "jsr:@zod/zod@^4.1.12",
··· 7 "build": "deno compile --allow-net --allow-read --allow-write --allow-env -o vmlinux-builder ./build.ts" 8 }, 9 "imports": { 10 + "@es-toolkit/es-toolkit": "jsr:@es-toolkit/es-toolkit@^1.41.0", 11 "@std/assert": "jsr:@std/assert@^1.0.15", 12 "@std/toml": "jsr:@std/toml@^1.0.11", 13 "@zod/zod": "jsr:@zod/zod@^4.1.12",
+5
deno.lock
··· 1 { 2 "version": "5", 3 "specifiers": { 4 "jsr:@std/assert@^1.0.15": "1.0.15", 5 "jsr:@std/collections@^1.1.3": "1.1.3", 6 "jsr:@std/internal@^1.0.12": "1.0.12", ··· 9 "npm:chalk@^5.6.2": "5.6.2" 10 }, 11 "jsr": { 12 "@std/assert@1.0.15": { 13 "integrity": "d64018e951dbdfab9777335ecdb000c0b4e3df036984083be219ce5941e4703b", 14 "dependencies": [ ··· 38 }, 39 "workspace": { 40 "dependencies": [ 41 "jsr:@std/assert@^1.0.15", 42 "jsr:@std/toml@^1.0.11", 43 "jsr:@zod/zod@^4.1.12",
··· 1 { 2 "version": "5", 3 "specifiers": { 4 + "jsr:@es-toolkit/es-toolkit@^1.41.0": "1.41.0", 5 "jsr:@std/assert@^1.0.15": "1.0.15", 6 "jsr:@std/collections@^1.1.3": "1.1.3", 7 "jsr:@std/internal@^1.0.12": "1.0.12", ··· 10 "npm:chalk@^5.6.2": "5.6.2" 11 }, 12 "jsr": { 13 + "@es-toolkit/es-toolkit@1.41.0": { 14 + "integrity": "4df54a18e80b869880cee8a8a9ff7a5e1c424a9fd0916dccd38d34686f110071" 15 + }, 16 "@std/assert@1.0.15": { 17 "integrity": "d64018e951dbdfab9777335ecdb000c0b4e3df036984083be219ce5941e4703b", 18 "dependencies": [ ··· 42 }, 43 "workspace": { 44 "dependencies": [ 45 + "jsr:@es-toolkit/es-toolkit@^1.41.0", 46 "jsr:@std/assert@^1.0.15", 47 "jsr:@std/toml@^1.0.11", 48 "jsr:@zod/zod@^4.1.12",