行時(shí)鏡像 `gcr.io/distroless/cc`:面向 Rust/D/C++ 的精簡(jiǎn) glibc 運(yùn)行環(huán)境構(gòu)建指南)
云原生【免費(fèi)下載鏈接】distroless Language focused docker images, minus the operating system.項(xiàng)目地址https://gitcode.com/GitHub_Trending/di/distroless點(diǎn)擊查看免費(fèi)下載導(dǎo)讀gcr.io/distroless/cc是 distroless 系列中專門為“mostly-statically compiled”大部分靜態(tài)編譯語(yǔ)言——如 Rust、D、C/C——準(zhǔn)備的精簡(jiǎn)運(yùn)行鏡像。它只包含一個(gè)最小的 Linux glibc 運(yùn)行環(huán)境不包含 shell、包管理器或任何與運(yùn)行無(wú)關(guān)的工具用戶需要自行將編譯好的應(yīng)用放進(jìn)去并設(shè)置 CMD。本文將以 cc/README.md 為核心結(jié)合 cc/cc.bzl、cc/config.bzl 與 examples/cc 中的示例完整講解該鏡像的內(nèi)容構(gòu)成、Bazel 構(gòu)建原理、多架構(gòu)發(fā)布方式與實(shí)戰(zhàn)用法。一、鏡像定位為“大部分靜態(tài)編譯”語(yǔ)言準(zhǔn)備的 glibc 運(yùn)行時(shí)按照官方文檔的描述gcr.io/distroless/cc鏡像包含一個(gè)最小的 Linux、glibc 運(yùn)行環(huán)境面向的是一類特殊語(yǔ)言它們?cè)诰幾g時(shí)把依賴大多靜態(tài)鏈接進(jìn)二進(jìn)制但運(yùn)行時(shí)仍需要 glibc標(biāo)準(zhǔn) C 庫(kù)的支持——典型代表就是Rust 和 DC/C 應(yīng)用同樣適用。這與 distroless 系列其他鏡像的分工有關(guān)。在 base/README.md 中可以看到完整的分層關(guān)系鏡像內(nèi)容定位gcr.io/distroless/staticca-certificates、root 用戶的 /etc/passwd 條目、/tmp 目錄、tzdata。適合純靜態(tài)編譯、不依賴 libc 的 Go 程序gcr.io/distroless/base-nossl上述全部?jī)?nèi)容 glibc。適合需要 libc 但不需要 libssl 的應(yīng)用gcr.io/distroless/base上述全部?jī)?nèi)容 glibc libsslDebian 13 起還附帶 zlib、libzstd 等 libssl 依賴gcr.io/distroless/ccbase 鏡像的全部?jī)?nèi)容 libgcc1含其依賴即本文主角用官方文檔的原話cc鏡像包含 base 鏡像中的一切再加上 libgcc1 及其依賴。libgcc1在 Debian 13 中對(duì)應(yīng)包名為libgcc-s1是 GCC 的底層運(yùn)行時(shí)庫(kù)Rust/D 這類“mostly-static”二進(jìn)制在運(yùn)行期調(diào)用編譯器內(nèi)建函數(shù)如 64 位整數(shù)除法、軟浮點(diǎn)輔助函數(shù)等時(shí)依賴它因此它是這類應(yīng)用運(yùn)行不可或缺的組成部分。注意cc鏡像不包含 OpenSSL legacy 算法。Debian 13 base 鏡像本身就不包含這些算法如確需使用需自行添加openssl-legacy-provider詳見(jiàn) base/README.md。二、鏡像內(nèi)容的源碼級(jí)證據(jù)實(shí)際打包了哪些包雖然 README 概括為“base libgcc1”但從構(gòu)建配置 cc/config.bzl 可以看到 Debian 13 上cc鏡像實(shí)際安裝的軟件包清單CC_DISTROS [debian13] CC_ARCHITECTURES { debian13: [amd64, arm64, arm, s390x, ppc64le, riscv64], } CC_PACKAGES { debian13: [ libgomp1, # GCC OpenMP 并行運(yùn)行時(shí)庫(kù) libstdc6, # GNU 標(biāo)準(zhǔn) C 庫(kù)libstdc libgcc-s1, # GCC 底層支持庫(kù)即 README 中的 libgcc1Debian 13 的新包名 gcc-14-base, # GCC 14 基礎(chǔ)包提供 GCC 版本相關(guān)的基礎(chǔ)文件 ], }對(duì)照 base 鏡像的配置base/config.bzlbase 打包的是libc6、libssl3t64、libzstd1、zlib1g而cc在此之上疊加了上述 GCC 相關(guān)庫(kù)。幾個(gè)值得注意的細(xì)節(jié)libgcc-s1與libgcc1的關(guān)系README 沿用了歷史上libgcc1的包名在 Debian 13trixie中該運(yùn)行時(shí)庫(kù)以libgcc-s1形式發(fā)布配置文件里也如實(shí)使用了新包名。libstdc6的存在說(shuō)明該鏡像不僅能跑純 C/Rust 程序也直接支持 C 運(yùn)行時(shí)——這是 README 一行“l(fā)ibgcc1 及其依賴”背后被展開的實(shí)際含義之一。libgomp1GCC 的 OpenMP 并行運(yùn)行時(shí)供使用并行計(jì)算能力的程序按需加載。這些包會(huì)通過(guò) cc/cc.bzl 中的deb.package(arch, distro, pkg)從 Debian 倉(cāng)庫(kù)解析、解包并打進(jìn)鏡像層最終產(chǎn)物是一個(gè)不含 shell、不含包管理器的純運(yùn)行鏡像。三、鏡像如何構(gòu)建Bazel 規(guī)則與多架構(gòu)索引3.1cc_image單架構(gòu)鏡像的組裝cc/cc.bzl 中的cc_image(distro, arch, packages)負(fù)責(zé)為每個(gè) distro/arch 組合生成鏡像。核心邏輯清晰直白o(hù)ci_image( name cc mode _ user _ arch _ distro, base //base:base mode _ user _ arch _ distro, tars [ deb.package(arch, distro, pkg) for pkg in packages ], annotations {org.opencontainers.image.source: OS_RELEASE[HOME_URL]}, )關(guān)鍵點(diǎn)以 base 鏡像為基底base //base:base...即直接疊加在 base 鏡像之上繼承其 ca-certificates、tzdata、glibc 等全部?jī)?nèi)容。包以 tar 層注入每個(gè) Debian 包經(jīng)deb.package()解析成 tar 層合并進(jìn)鏡像。命名矩陣鏡像名由mode × user × arch × distro四維展開見(jiàn) 3.3。OCI 注解寫入org.opencontainers.image.source等元數(shù)據(jù)。3.2cc_image_index多架構(gòu)鏡像索引cc/cc.bzl 中的cc_image_index(distro, architectures)使用oci_image_index把同一 distro 下各架構(gòu)鏡像聚合成一個(gè) multi-arch 索引拉取時(shí) Docker/OCI 客戶端會(huì)按平臺(tái)自動(dòng)選擇對(duì)應(yīng)架構(gòu)的鏡像。3.3 命名矩陣mode × user × arch × distro從 cc/cc.bzl 和 common/variables.bzl 可以還原出完整的鏡像命名體系DEBUG_MODE [, _debug] # 普通版與 debug 版含 busybox 調(diào)試工具 USERS [root, nonroot] # root 與 nonrootUID 65532兩種運(yùn)行用戶于是每個(gè) distro/arch 會(huì)產(chǎn)出 4 個(gè)鏡像例如 Debian 13 amd64 下有cc_root_amd64_debian13普通版 rootcc_nonroot_amd64_debian13普通版 nonrootUID 65532cc_root_debug_amd64_debian13debug 版 rootcc_nonroot_debug_amd64_debian13debug 版 nonrootcc/BUILD 中通過(guò)兩層列表推導(dǎo)式把CC_DISTROS與CC_ARCHITECTURES組合出全矩陣的構(gòu)建與索引目標(biāo)[ cc_image( arch arch, distro distro, packages CC_PACKAGES[distro], ) for distro in CC_DISTROS for arch in CC_ARCHITECTURES[distro] ]當(dāng)前cc鏡像支持的 distro 為debian13支持架構(gòu)覆蓋amd64、arm64、arm、s390x、ppc64le、riscv64六種。uid/gid 約定來(lái)自 common/variables.bzlROOT 0、NONROOT 65532、NOBODY 65534nonroot 鏡像即以 65532 用戶運(yùn)行這是 distroless 安全設(shè)計(jì)最小權(quán)限的核心體現(xiàn)。四、實(shí)戰(zhàn)用法一Dockerfile 多階段構(gòu)建官方文檔明確給出使用方式“用戶應(yīng)把自己的編譯產(chǎn)物放進(jìn)鏡像并設(shè)置正確的 CMD”。cc鏡像沒(méi)有包管理器也沒(méi)有編譯器它只負(fù)責(zé)“運(yùn)行”。最典型的做法是多階段構(gòu)建——在帶編譯器的鏡像里編譯在cc鏡像里運(yùn)行。倉(cāng)庫(kù)自帶的示例 examples/cc/Dockerfile 展示了完整流程FROM gcc:6 AS build-env COPY . /app WORKDIR /app RUN cc hello.c -o hello FROM gcr.io/distroless/cc COPY --frombuild-env /app /app WORKDIR /app CMD [./hello]要點(diǎn)拆解編譯階段使用gcc官方鏡像作為構(gòu)建環(huán)境cc hello.c -o hello編譯出靜態(tài)程度較高的二進(jìn)制。運(yùn)行階段切換到gcr.io/distroless/cc只把編譯產(chǎn)物COPY進(jìn)去。設(shè)置 CMDCMD [./hello]使用exec 形式JSON 數(shù)組。在 distroless 鏡像中沒(méi)有 shell因此 CMD 必須以 exec 形式給出——CMD ./hello這種 shell 形式會(huì)因?yàn)檎也坏?bin/sh而失敗。ENTRYPOINT 可選如果你希望鏡像固定入口例如作為服務(wù)鏡像可以用ENTRYPOINT聲明可執(zhí)行文件CMD 僅傳參數(shù)。倉(cāng)庫(kù)的 Bazel 封裝 private/oci/cc_image.bzl 正是這樣做的oci_image( name name, base base, entrypoint [ /%s_binary % name, ], tars [:%s_layer % name], )它把cc_binary編譯出的二進(jìn)制打包成 tar 層并設(shè)置為entrypoint無(wú)需外部再寫 CMD。安全提示cc鏡像沒(méi)有 shell、沒(méi)有包管理器攻擊面極小生產(chǎn)環(huán)境建議優(yōu)先選擇nonroot變體gcr.io/distroless/cc:nonroot并以 UID 65532 運(yùn)行進(jìn)一步降低提權(quán)風(fēng)險(xiǎn)。五、實(shí)戰(zhàn)用法二Bazel 原生構(gòu)建cc_image對(duì)于 Bazel 項(xiàng)目倉(cāng)庫(kù)在 private/oci/cc_image.bzl 提供了高層次的cc_image(name, srcs, base)規(guī)則自動(dòng)完成“編譯 → 打包 → 組裝鏡像”全流程def cc_image(name, srcs, base): cc_binary( name %s_binary % name, srcs srcs, ) tar( name %s_layer % name, extension tar.gz, srcs [:%s_binary % name], ) oci_image( name name, base base, entrypoint [/%s_binary % name], tars [:%s_layer % name], )examples/cc/BUILD 中即用此規(guī)則為 C 與 C 兩種語(yǔ)言各生成鏡像并以//cc:cc_root_amd64_debian13作為基底[cc_image( name hello_ distro, srcs [hello.c], base //cc:cc_root_amd64_ distro, ) for distro in DISTROS] [cc_image( name hello_cc_ distro, srcs [hello_cc.cc], base //cc:cc_root_amd64_ distro, ) for distro in DISTROS]對(duì)應(yīng)的 C 與 C 示例源碼分別為 examples/cc/hello.c 和 examples/cc/hello_cc.cc編譯產(chǎn)物分別以/hello_debian13_binary、/hello_cc_debian13_binary為入口運(yùn)行。六、如何驗(yàn)證鏡像container_structure_test倉(cāng)庫(kù)用container_structure_test對(duì)cc鏡像做結(jié)構(gòu)測(cè)試這既是 CI 的質(zhì)量保障也可以作為讀者驗(yàn)證自己鏡像是否可用的參考模板。測(cè)試聲明見(jiàn) examples/cc/BUILDcontainer_structure_test( name hello_cc_ distro _test, size small, configs [testdata/hello_cc_ distro .yaml], image :hello_cc_ distro, tags [amd64, manual], )測(cè)試配置 examples/cc/testdata/hello_cc_debian13.yaml 驗(yàn)證鏡像內(nèi)的二進(jìn)制能真實(shí)運(yùn)行并輸出預(yù)期內(nèi)容schemaVersion: 1.0.0 commandTests: - name: hello_cc command: [/hello_cc_debian13_binary] expectedOutput: [Hello from distroless C\\!]對(duì)應(yīng)的 C 版測(cè)試 examples/cc/testdata/hello_debian13.yaml 驗(yàn)證printf(Hello from distroless C!\n)的輸出。這套測(cè)試從側(cè)面印證了cc鏡像的運(yùn)行能力只放二進(jìn)制 設(shè)置入口即可在無(wú) shell 環(huán)境下正常啟動(dòng)執(zhí)行。七、使用限制與注意事項(xiàng)必須自帶編譯產(chǎn)物鏡像內(nèi)沒(méi)有編譯器、鏈接器也沒(méi)有包管理器無(wú)法在容器內(nèi)編譯或安裝依賴一切編譯必須在構(gòu)建階段完成。CMD/ENTRYPOINT 必須用 exec 形式無(wú) shell 環(huán)境意味著字符串形式命令無(wú)法執(zhí)行。運(yùn)行用戶默認(rèn)鏡像以 root 運(yùn)行如需最小權(quán)限使用nonroot變體UID 65532。依賴完整性由你負(fù)責(zé)若二進(jìn)制動(dòng)態(tài)鏈接了其他庫(kù)例如自定義的.so需要自行在 Dockerfile 中一并復(fù)制進(jìn)鏡像cc鏡像只預(yù)裝 README 與 cc/config.bzl 列出的 GCC/glibc 運(yùn)行時(shí)庫(kù)。OpenSSL legacy 算法缺失如應(yīng)用依賴傳統(tǒng)加密算法需自行補(bǔ)充openssl-legacy-provider。架構(gòu)匹配拉取或構(gòu)建時(shí)確保平臺(tái)架構(gòu)與 cc/config.bzl 中列出的六種架構(gòu)之一對(duì)應(yīng)多架構(gòu)環(huán)境下應(yīng)使用cc_image_index生成的索引鏡像由運(yùn)行時(shí)自動(dòng)選擇??偨Y(jié)gcr.io/distroless/cc是 distroless 家族中面向 Rust、D、C/C 等“mostly-static”語(yǔ)言的最小 glibc 運(yùn)行鏡像它在 base 鏡像ca-certificates、tzdata、glibc、libssl之上疊加了libgcc-s1、libstdc6、libgomp1、gcc-14-base等 GCC 運(yùn)行時(shí)庫(kù)支持 root/nonroot、debug 變體與六大架構(gòu)。使用上遵循“編譯在外、運(yùn)行在內(nèi)”的多階段構(gòu)建模式配以 exec 形式的 CMD即可獲得一個(gè)無(wú) shell、攻擊面極小、可安全運(yùn)行 C/C/Rust/D 應(yīng)用的極簡(jiǎn)容器。深入閱讀 cc/README.md、cc/cc.bzl、cc/config.bzl 與 examples/cc 目錄可以掌握鏡像的全部構(gòu)建細(xì)節(jié)與可復(fù)制的示例。贊分享云原生【免費(fèi)下載鏈接】distroless Language focused docker images, minus the operating system.項(xiàng)目地址https://gitcode.com/GitHub_Trending/di/distroless點(diǎn)擊查看免費(fèi)下載相關(guān)推薦還在為另存為抓狂5分鐘上手這款免費(fèi)開源完整網(wǎng)站下載工具還在為另存為抓狂5分鐘上手這款免費(fèi)開源完整網(wǎng)站下載工具 核心關(guān)鍵詞完整網(wǎng)站下載工具 長(zhǎng)尾關(guān)鍵詞網(wǎng)站源碼一鍵下載、整站資源離線保存、Node.js 網(wǎng)站后端網(wǎng)頁(yè)爬蟲自定義代幣橋?qū)崙?zhàn)如何通過(guò)Custom Gateway將ERC20橋接到Scroll自定義代幣橋?qū)崙?zhàn)如何通過(guò)Custom Gateway將ERC20橋接到Scroll 想要把自己的 ERC20 代幣從以太坊主網(wǎng)或 Sepolia 測(cè)試網(wǎng)安探索Distroless輕量級(jí)、安全的容器運(yùn)行環(huán)境探索Distroless輕量級(jí)、安全的容器運(yùn)行環(huán)境 是由 Google Container Tools 開發(fā)的一個(gè)開源項(xiàng)目旨在提供一個(gè)最小化的、無(wú)操作系統(tǒng)的云原生上一篇Bangumi 追番客戶端實(shí)用指南3 步跑通手機(jī)上免費(fèi)記錄管理番組進(jìn)度下一篇Universal x86 Tuning Utility終極硬件性能調(diào)優(yōu)指南解鎖AMD/Intel隱藏性能創(chuàng)作聲明:本文部分內(nèi)容由AI輔助生成(AIGC),僅供參考