使用 Docker 编译 ImmortalWrt/OpenWrt
使用 Docker 编译 ImmortalWrt/OpenWrt
来源 https://blog.fxpblogs.win/archives/use-docker-to-build-openwrt
〇、前言
本教程不使用 VMWare 等虚拟机软件,而是在 Docker 上编译 ImmortalWrt,全程使用终端进行操作,可能需要少许的 Linux 的基础,比如掌握 ls cd 等基础命令以及对 Docker 有基本的认识。
温馨提示:从这里开始,请使用魔法上网。
一、部署 Docker Desktop
官网下载:https://www.docker.com/products/docker-desktop/,看不懂英文的,直接点 这里下载
然后按照教程来(懒得写了 ( ̄o ̄) . z Z ):https://blog.csdn.net/Natsuago/article/details/145588600
二、部署 Linux 容器
到这里,你应该已经安装并启动 Docker 程序界面了(下面的操作将全程不使用 GUI 界面 🤣)
1、安装 Linux 容器
-
打开 Windows 终端:(右键开始菜单,选择终端管理员),拉取 Ubuntu 24.04版本的镜像
-
部署容器并进入其终端(直接在镜像界面上点击运行容器是运行不起来的)
2、更换软件源
虽然已经给网络附魔了,但是准备编译环境时还需要下载大量的软件包。
-
安装文件编辑软件 nano (比 vi 好用,因为可以复制粘贴)与验证 SSL 证书合法性的软件包 ca-certificates(必须安装,不然换源后无法使用)
-
这里使用 清华镜像站,里面有详细说明
Ubuntu 24.04 以上版本的使用 DEB822 格式而不是传统格式,勾选强制安全更新使用镜像(因为不是生产环境,所以勾选没问题,能加快软件包安装速度)

1、打开软件源列表
2、注释原来的两段,并将清华镜像站的两段复制进去

3、保存: Ctrl + O,回车
4、回到终端:Ctrl + X
三、配置编译环境
-
根据 ImmortalWrt Github 中的指导进行配置,但是不要加 sudo(已经拥有 root 权限,且没有安装 sudo),注意方法1方法2也同样执行,中途要选择地区和语言就选 5(Asia)和 69(Shanghai)
A few moments later...
官方安装脚本执行成功后,你应该能看到结尾显示 [SUCCESS] All dependencies have been installed. 如果没有,那就重新执行脚本,出问题的基本上是网络问题。
-
强制使用 root 权限编译,GitHub 上的 Note 提到不可使用 root 进行编译,但是我们现在就是 root,因此加一个环境变量(必须加,不然编译检查阶段就不通过)(为什么官方不建议你去用 root 编译呢,是因为怕把你系统搞崩了,但是我们在 Docker 上编译就没什么关系了)
-
到这里,我们的编译环境就准备好了,再打开一个 Windows 终端(不要在当前 Docker 容器的终端执行),执行下面的命令将当前容器保存为一个镜像,下面如果搞崩了就不用重新配置环境了,运行保存好的镜像就行。
四、拉取官方源码
-
拉取官方源码
上面的 -b 参数指的是分支,目前最新的分支是 openwrt-24.10 ,在GitHub 界面的 Code 中查看。(别手贱选 master 或 main ,这些开发分支什么也没有配置,包括 luci )

-
更新软件包列表
五、添加第三方软件
虽然 ImmortalWrt 中的源提供的软件包足够用了,但是还是有不少需要我们去手动添加才有的,下面我就以 OpenClash、MosDNS、Partexp(用于硬路由上的 U盘扩容)为例,说明如何添加第三方软件。
基本上就是把第三方包添加到源码中的 package 目录下即可,该操作应该在执行完上面的 ./scripts/feeds install -a 之后。
OpenClash
GitHub 网站:https://github.com/vernesong/OpenClash/tree/master
MosDNS
GitHub 网站:https://github.com/sbwml/luci-app-mosdns
MosDNS 的添加稍微复杂了一点,因为依赖其自定义的软件包 V2dat
Partexp
GitHub 网站:https://github.com/sirpdboy/luci-app-partexp
六、配置编译选项
进入编译配置菜单,自定义编译
1、选择目标机型(以小旋风 pro 为例)
目标平台 Target System:MediaTek ARM
平台子选项 Subtarget:Filogic 8x0 (MT798x)
目标机型 Target Profile:ASUS TUF-AX4200
2、选择软件包(按需选择,某些软件包 ImmortalWrt 含有,而 OpenWrt 没有)
进入 Luci -> Applications
-
Collections
-
luci ( Web 界面,ImmortalWrt 默认添加,OpenWrt 默认没有)
-
-
Modules -> Translations
-
Chinese Simplified (zh_Hans)(中文包,ImmortalWrt 默认添加,OpenWrt 默认没有)
-
-
Applications
-
luci-app-argon-config(argon 主题设置)
-
luci-app-autoreboot (自动重启设置)
-
luci-app-cpufreq(CPU 频率调整)
-
luci-app-ddns-go(动态域名解析)
-
luci-app-diskman(磁盘管理)
-
luci-app-mosdns(第三方软件)
-
luci-app-openclash(第三方软件)
-
luci-app-partexp(第三方软件)
-
luci-app-ramfree(内存释放)
-
luci-app-ttyd(终端)
-
luci-app-uhttpd(Web 服务器设置界面)
-
luci-app-upnp(UPNP)
-
luci-app-wifischedule(WiFi 定时)
-
luci-app-wol(网络唤醒)
-
-
Themes
-
luci-theme-argon(argon 主题)
-
3、保存配置
按左右方向键到 <save>,点击保存配置

七、编译
先多线程下载好所需的软件包(这一点很重要),免得编译的时候报错。然后再编译,如果编译报错,取消 -j4 多线程参数,然后再单线程编译,找出错误所在。(编译过程可能持续 3~6 个小时,稍安勿躁)
如果编译顺利没有出错,那么恭喜!!!你已经学会了如何使用 Docker 编译 Openwrt。
编译完成后的固件在 ImmortalWrt 下的 /bin/targets 目录下,利用 ls 和 cd 命令找到生成的固件,比如我的小旋风 pro ,其路径为 /bin/targets/mediatek/filogic ,固件文件名为 immortalwrt-mediatek-filogic-asus_tuf-ax4200-squashfs-sysupgrade.bin
八、导出固件文件
编译完成后,需要从 Docker 容器中导出固件到 Windows 中。
至此,结束。
我的 Q&A
如何进入已经在运行的容器终端
编译时 U-boot 报错,缺失 config.h 文件
错误提示:
make[4]: Entering directory '/usr/local/openwrt/build_dir/target-aarch64_cortex-a53_musl/u-boot-2025.01'
ENVP include/generated/env.in
<command-line>: fatal error: include/config.h: No such file or directory
compilation terminated.
排查:
进入 uboot 目录单独编译发现错误
scripts/dtc/pylibfdt/libfdt_wrap.c:177:11: fatal error: Python.h: No such file or directory
177 | # include <Python.h>
| ^~~~~~~~~~
compilation terminated.
这个问题发生在我用 Debian 容器而不是 Ubuntu,这是因为缺失了 Python.h 头文件导致的(感谢 DeepSeek),重新安装 Python 软件包即可。
======= End



浙公网安备 33010602011771号