建鏡像:FFmpeg-Builds編譯配置核心 vars.sh 全解析)
10分鐘打通FFmpeg構(gòu)建鏡像FFmpeg-Builds編譯配置核心 vars.sh 全解析【免費(fèi)下載鏈接】FFmpeg-Builds項(xiàng)目地址: https://gitcode.com/gh_mirrors/ff/FFmpeg-Builds./makeimage.sh linux64 GPL報(bào)出Invalid target/variant日志只有一行看不出參數(shù)在哪一步被判死。這個錯誤源頭是 FFmpeg-Builds 編譯配置的總?cè)肟?util/vars.sh全文 148 行。讀完你能獨(dú)立回答三個問題一組參數(shù)會生成什么鏡像標(biāo)簽、版本號插件如何切換源碼分支、以及如何把你的自定義鏈接選項(xiàng)注入最終 Dockerfile。 util/vars.sh 在項(xiàng)目里的位置命令行到 Dockerfile 的翻譯層這個文件是整個構(gòu)建流程中唯一的參數(shù)解析層。三個入口腳本 makeimage.sh、generate.sh、download.sh 的第一件事都是source util/vars.sh隨后依賴它導(dǎo)出的變量TARGET、VARIANT、ADDINS、IMAGE、FFVER等。它本身不寫一行 Dockerfile——generate.sh 里每條to_df寫入的內(nèi)容都引用它定義的變量??梢园阉斫獬善跫s命令行參數(shù)在這被翻譯成鏡像標(biāo)簽 編譯選項(xiàng)串scripts.d 和 variants 下的上百個腳本全部依賴這份契約工作。 如何指定目標(biāo)架構(gòu)TARGET 與 VARIANT 的雙重校驗(yàn)TARGET 和 VARIANT 是前兩個必傳參數(shù)二者拼接成的文件名必須真實(shí)存在否則直接退出。問題背景項(xiàng)目覆蓋 linux64/win64/arm64 等 7 種架構(gòu)每種又分 gpl/lgpl/nonfree 與 static/shared 共 6 種變體合法組合超過 40 個。vars.sh 用文件是否存在代替硬編碼白名單TARGET$1 VARIANT$2 shift 2 if ! [[ -f variants/${TARGET}-${VARIANT}.sh ]]; then echo Invalid target/variant exit -1 fi校驗(yàn)即文檔variants/ 目錄里有什么組合就支持什么組合新增變體無需改動本文件。如果你要改它注意變體文件的寫法是兩行 sourcesource $(dirname $BASH_SOURCE)/linux-install-static.sh source $(dirname $BASH_SOURCE)/defaults-gpl.sh打包方式和協(xié)議選項(xiàng)被拆成正交維度defaults-gpl.sh 里才真正寫著--enable-gpl --enable-version3。不要把選項(xiàng)塞進(jìn)單一文件否則 shared 版本會互相污染。 addin 插件機(jī)制命令行參數(shù)如何變成鏡像標(biāo)簽第 3 個及之后的參數(shù)都是 addin每個必須對應(yīng) addins/ 下同名腳本按傳入順序拼進(jìn)鏡像標(biāo)簽。版本號分支、debug 符號、LTO 都是正交需求寫死在主流程里會讓參數(shù)組合爆炸。vars.sh 的做法ADDINS() ADDINS_STR while [[ $# -gt 0 ]]; do [[ -f addins/${1}.sh ]] || { echo Invalid addin: $1; exit -1; } ADDINS( $1 ) ADDINS_STR${ADDINS_STR}${ADDINS_STR:-}$1 shift done IMAGE${REGISTRY}/${REPO}/${TARGET}-${VARIANT}${ADDINS_STR:-}${ADDINS_STR}:latest${ADDINS_STR:-}保證第一個 addin 前不多出連字符。addins/8.0.sh 全文只有一行GIT_BRANCHrelease/8.0卻同時影響源碼分支和標(biāo)簽后綴。鏡像標(biāo)簽命名規(guī)則最終標(biāo)簽 registry 倉庫 TARGET-VARIANT 連字符拼接的全部 addin :latest。例如linux64 gpl 8.0 debug得到ghcr.io/btbn/ffmpeg-builds/linux64-gpl-8.0-debug:latest。倉庫前綴取GITHUB_REPOSITORY環(huán)境變量缺省 btbn/ffmpeg-buildsregistry 取REGISTRY_OVERRIDE缺省 ghcr.io。如果你要改它注意 addin 的傳入順序只影響標(biāo)簽不影響邏輯——generate.sh 對每個 addin 在獨(dú)立子 shell 里 source互不干擾。? FFmpeg 版本選擇ffbuild_ffver 的版本碼映射ffbuild_ffver 從 ADDINS_STR 反推出數(shù)字版本碼未傳版本 addin 時返回 99999999代表 master 最新。generate.sh 要把 FFVER 寫進(jìn)鏡像 ENV下游階段腳本用它做新舊分支的選項(xiàng)兼容判斷ffbuild_ffver() { case $ADDINS_STR in *7.0*) echo 700 ;; *7.1*) echo 701 ;; *8.0*) echo 800 ;; *8.1*) echo 801 ;; *9.0*) echo 900 ;; *) echo 99999999 ;; esac }99999999 大于任何發(fā)行版本號下游用[[ $FFVER -gt 700 ]]這類比較即可判斷新舊不需要字符串解析。如果你要改它注意匹配對象是拼接后的 ADDINS_STR8.0 debug同樣命中*8.0*。新增版本 addin 時必須同步補(bǔ)一個 case 分支否則會靜默落入默認(rèn)分支、被當(dāng)成最新版編譯。 如何注入自定義編譯選項(xiàng)12 個鉤子函數(shù)vars.sh 末尾定義了 12 個空鉤子configure/unconfigure、cflags/uncflags、cxxflags/uncxxflags、ldexeflags/unldexeflags、ldflags/unldflags、libs/unlibsgenerate.sh 匯總各依賴的輸出后寫進(jìn)鏡像。問題背景每個依賴包要向 FFmpeg 主 configure 貢獻(xiàn)幾個選項(xiàng)行又不允許改 FFmpeg 源碼。以 scripts.d/50-x264.sh 為例ffbuild_configure() { echo --enable-libx264; } ffbuild_unconfigure() { echo --disable-libx264; } ffbuild_enabled() { [[ $VARIANT lgpl* ]] return -1 return 0 }generate.sh 側(cè)的匯總邏輯for SCRIPT in ${SCRIPTS[]}; do FF_CONFIGURE $(get_output $SCRIPT configure) FF_CFLAGS $(get_output $SCRIPT cflags) FF_LIBS $(get_output $SCRIPT libs) done啟用的包調(diào)ffbuild_configure被禁用的包調(diào)ffbuild_unconfigure——這正是 lgpl 鏡像沒有 x264 的機(jī)制enabled 檢查返回失敗匯總進(jìn)選項(xiàng)串的反而是--disable-libx264。如果你要改它注意鉤子只負(fù)責(zé) echo 字符串、不執(zhí)行構(gòu)建邏輯構(gòu)建在各腳本的 ffbuild_dockerbuild 里。想加一個--extra-libs就在對應(yīng)腳本的 ffbuild_ldflags 里加一行 echovars.sh 的空實(shí)現(xiàn)保證任何腳本被 source 時函數(shù)都有定義不會報(bào)未定義。組合演練三條命令覆蓋全部入口在倉庫根目錄clone 地址https://gitcode.com/gh_mirrors/ff/FFmpeg-Builds依次執(zhí)行./generate.sh linux64 gpl 8.0 debug # 只生成 Dockerfile不構(gòu)建 ./makeimage.sh win64 nonfree 7.1 # 完整流程基礎(chǔ)鏡像→下載→Dockerfile→最終鏡像 ./download.sh # 僅預(yù)下載全部依賴源碼到 .cache/downloads參數(shù)產(chǎn)物 / 效果linux64 gpl選項(xiàng)含--enable-gpl --enable-version3靜態(tài)鏈接基于 base-linux64 鏡像8.0GIT_BRANCHrelease/8.0FFVER800標(biāo)簽后綴-8.0debug追加--optflags-Og --disable-stripping產(chǎn)物體積約增加 250MB不傳版本 addinFFVER99999999從 master 最新編譯lgpl變體x264/x265 被主動禁用最終 ffmpeg 無 libx264 編碼器避坑清單現(xiàn)象Invalid target/variant。原因大小寫或分隔符與文件名不符文件是variants/linux64-gpl.shGPL、gpl_shared都失敗。處理ls variants/后逐字符對照。現(xiàn)象最終鏡像ffmpeg -encoders查不到 libx264。原因變體是 lgpl*50-x264.sh 的 ffbuild_enabled 拒絕啟用匯總進(jìn)選項(xiàng)的是--disable-libx264。處理換 gpl 或 nonfree 變體?,F(xiàn)象鏡像 ENV 里 FFVER 是 99999999疑似異常。原因沒傳版本 addin該值就是master 最新的正常表示。處理需要固定發(fā)布分支就補(bǔ)傳8.0之類參數(shù)?,F(xiàn)象鏡像標(biāo)簽前綴不是 ghcr.io/btbn/ffmpeg-builds。原因設(shè)置了GITHUB_REPOSITORY或REGISTRY_OVERRIDEvars.sh 優(yōu)先取環(huán)境變量。處理執(zhí)行前env | grep -E GITHUB_REPOSITORY|REGISTRY確認(rèn)。vars.sh 本身不做任何編譯它是把命令行三組參數(shù)翻譯成鏡像標(biāo)簽與選項(xiàng)串的契約下游所有腳本都在履行這份契約。延伸閱讀README.mdtargets/variants/addins 完整清單與官方構(gòu)建保留策略scripts.d/50-x264.sh單個依賴從構(gòu)建到鉤子的完整范例makeimage.sh從基礎(chǔ)鏡像到最終鏡像的 buildx 構(gòu)建流程【免費(fèi)下載鏈接】FFmpeg-Builds項(xiàng)目地址: https://gitcode.com/gh_mirrors/ff/FFmpeg-Builds創(chuàng)作聲明:本文部分內(nèi)容由AI輔助生成(AIGC),僅供參考