<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          Earthly 一個(gè)更加強(qiáng)大的鏡像構(gòu)建工具

          共 5595字,需瀏覽 12分鐘

           ·

          2021-10-30 14:01


          一、Earthly 介紹

          開局一張圖,功能全靠吹。

          Earthly 是一個(gè)更加高級(jí)的 Docker 鏡像構(gòu)建工具,Earthly 通過自己定義的 Earthfile 來代替?zhèn)鹘y(tǒng)的 Dockerfile 完成鏡像構(gòu)建;Earthfile 就如同 Earthly 官方所描述:

          Makefile + Dockerfile = Earthfile

          在使用 Earthly 進(jìn)行構(gòu)建鏡像時(shí)目前強(qiáng)依賴于 buildkit,Earthly 通過 buildkit 支持了一些 Dockerfile ?的擴(kuò)展語(yǔ)法,同時(shí)將 Dockerfile 與 Makefile 整合,使得多平臺(tái)構(gòu)建和代碼化 Dockerfile 變得更加簡(jiǎn)單;使用 ?Earthly 可以更加方便的完成 Dockerfile 的代碼復(fù)用以及更加友好的 CI 自動(dòng)集成。

          二、快速開始

          2.1、安裝依賴

          Earthly 目前依賴于 Docker 和 Git,所以安裝 Earthly 前請(qǐng)確保機(jī)器已經(jīng)安裝了 Docker 和 Git。

          2.2、安裝 Earthly

          Earthly 采用 Go 編寫,所以主要就一個(gè)二進(jìn)制文件,Linux 下安裝可以直接參考官方的安裝腳本:

          $?sudo?/bin/sh?-c?'wget?https://github.com/earthly/earthly/releases/latest/download/earthly-linux-amd64?-O?/usr/local/bin/earthly?&&?chmod?+x?/usr/local/bin/earthly?&&?/usr/local/bin/earthly?bootstrap?--with-autocomplete'

          安裝完成后 Earthly 將會(huì)啟動(dòng)一個(gè) buildkitd 容器: earthly-buildkitd

          2.3、語(yǔ)法高亮

          目前 Earthly 官方支持 VS Code、VIM 以及 Sublime Text 三種編輯器的語(yǔ)法高亮,具體如何安裝請(qǐng)參考 官方文檔[1]

          2.4、基本使用

          本示例源于官方 Basic 教程,以下示例以編譯 Go 項(xiàng)目為樣例:

          首先創(chuàng)建一個(gè)任意名稱的目錄,目錄中存在項(xiàng)目源碼文件以及一個(gè) Earthfile 文件;

          main.go

          package?main

          import?"fmt"

          func?main()?{
          ????fmt.Println("hello?world")
          }

          Earthfile

          FROM?golang:1.17-alpine
          WORKDIR?/go-example

          build:
          ????COPY?main.go?.
          ????RUN?go?build?-o?build/go-example?main.go
          ????SAVE?ARTIFACT?build/go-example?/go-example?AS?LOCAL?build/go-example

          docker:
          ????COPY?+build/go-example?.
          ????ENTRYPOINT?["/go-example/go-example"]
          ????SAVE?IMAGE?go-example:latest

          有了 Earthfile 以后我們就可以使用 Earthly 將其打包為鏡像;

          #?目錄結(jié)構(gòu)
          ~/t/earthlytest?????tree
          .
          ├──?Earthfile
          └──?main.go

          0?directories,?2?files

          #?通過?earthly?進(jìn)行構(gòu)建
          ~/t/earthlytest?????earthly?+docker

          構(gòu)建完成后我們就可以直接從 docker 的 images 列表中查看剛剛構(gòu)建的鏡像,并運(yùn)行:

          三、進(jìn)階使用

          3.1、多階段構(gòu)建

          Earthfile 中包含類似 Makefile 一樣的 target,不同的 target 之間還可以通過特定語(yǔ)法進(jìn)行引用,每個(gè) target 都可以被單獨(dú)執(zhí)行,執(zhí)行過程中 earthly 會(huì)自動(dòng)解析這些依賴關(guān)系。

          這種多階段構(gòu)建時(shí)語(yǔ)法很彈性,我們可以在每個(gè)階段運(yùn)行獨(dú)立的命令以及使用不同的基礎(chǔ)鏡像;從快速開始中可以看到,我們始終使用了一個(gè)基礎(chǔ)鏡像(golang:1.17-alpine),對(duì)于 Go 這種編譯后自帶運(yùn)行時(shí)不依賴其語(yǔ)言 SDK 的應(yīng)用,我們事實(shí)上可以將 “發(fā)布物” 僅放在簡(jiǎn)單的運(yùn)行時(shí)系統(tǒng)鏡像內(nèi),從而減少最終鏡像體積:

          由于使用了多個(gè) target,所以我們可以單獨(dú)的運(yùn)行 build 這個(gè) target 來驗(yàn)證我們的編譯流程,這種多 target 的設(shè)計(jì)方便我們構(gòu)建應(yīng)用時(shí)對(duì)編譯、打包步驟的細(xì)化拆分,同時(shí)也方便我們進(jìn)行單獨(dú)的驗(yàn)證。 例如我們單獨(dú)執(zhí)行 build 這個(gè) target 來驗(yàn)證我們的編譯流程是否正確:

          在其他階段驗(yàn)證完成后,我們可以直接運(yùn)行最終的 target,earthly 會(huì)自動(dòng)識(shí)別到這種依賴關(guān)系從而自動(dòng)運(yùn)行其依賴的 target:

          3.2、擴(kuò)展指令

          3.2.1、SAVE

          SAVE 指令是 Earthly 自己的一個(gè)擴(kuò)展指令,實(shí)際上分為 SAVE ARTIFACTSAVE IMAGE;其中 SAVE ARTIFACT 指令格式如下:

          SAVE?ARTIFACT?[--keep-ts]?[--keep-own]?[--if-exists]?[--force]??[]?[AS?LOCAL?]

          SAVE ARTIFACT 指令用于將文件或目錄從 build 運(yùn)行時(shí)環(huán)境保存到 target 的 artifact 環(huán)境;當(dāng)保存到 artifact 環(huán)境后,可以通過 COPY 等命令在其他位置進(jìn)行引用,類似于 Dockerfile 的 COPY --from... 語(yǔ)法;不同的是 SAVE ARTIFACT 支持 AS LOCAL 附加參數(shù),一但指定此參數(shù)后,earthly 會(huì)同時(shí)將文件或目錄在宿主機(jī)復(fù)制一份,一般用于調(diào)試等目的。SAVE ARTIFACT 命令在上面的樣例中已經(jīng)展示了,在運(yùn)行完 earthly +build 命令后實(shí)際上會(huì)在本地看到被 SAVE 出來的 ARTIFACT:

          而另一個(gè) SAVE IMAGE 指令則主要用于將當(dāng)前的 build 環(huán)境 SAVE 為一個(gè) IMAGE,如果指定了 --push 選項(xiàng),同時(shí)在執(zhí)行 earthly +target 命令時(shí)也加入 --push 選項(xiàng),該鏡像將會(huì)自動(dòng)被推送到目標(biāo) Registry 上。SAVE IMAGE 指令格式如下:

          SAVE?IMAGE?[--cache-from=]?[--push]?...

          3.2.2、GIT CLONE

          GIT CLONE 指令用于將指定 git 倉(cāng)庫(kù) clone 到 build 環(huán)境中;與 RUN git clone... 命令不同的是,GIT CLONE 通過宿主機(jī)的 git 命令運(yùn)行,它不依賴于容器內(nèi)的 git 命令,同時(shí)還可以直接為 earthly 配置 git 認(rèn)證,從而避免將這些安全信息泄漏到 build 環(huán)境中; 關(guān)于如何配置 earthly 的 git 認(rèn)證請(qǐng)參考 官方文檔[2];下面是 GIT CLONE 指令的樣例:

          3.2.3、COPY

          COPY 指令與標(biāo)準(zhǔn)的 Dockerfile COPY 指令類似,除了支持 Dockerfile 標(biāo)準(zhǔn)的 COPY 功能以外,earthly 中的 COPY 指令可以引用其他 target 環(huán)節(jié)產(chǎn)生的 artifact,在引用時(shí)會(huì)自動(dòng)聲明依賴關(guān)系;即當(dāng)在 B target 中存在 COPY +A/xxxxx /path/to/copy 類似的指令時(shí),如果只單純的執(zhí)行 earthly +B,那么 earthly 根據(jù)依賴分析會(huì)得出在 COPY 之前需要執(zhí)行 target A。COPY 指令的語(yǔ)法格式如下:

          #?與?Dockerfile?相同的使用方式,從上下文復(fù)制
          COPY?[options...]?...?

          #?擴(kuò)展支持的從?target?復(fù)制方式
          COPY?[options...]?...?

          3.2.4、RUN

          RUN 指令在標(biāo)準(zhǔn)使用上與 Dockerfile 里保持一致,除此之外增加了更多的擴(kuò)展選項(xiàng),其指令格式如下:

          #?shell?方式運(yùn)行(/bin/sh?-c)
          RUN?[--push]?[--entrypoint]?[--privileged]?[--secret?=]?[--ssh]?[--mount?]?[--]?<command>

          #?exec?方式運(yùn)行
          RUN?[[...],?"",?"",?"",?...]

          其中 --privileged 選項(xiàng)允許運(yùn)行的命令使用 privileged capabilities,但是需要 earthly 在運(yùn)行 target 時(shí)增加 --allow-privileged 選項(xiàng);--interactive / --interactive-keep 選項(xiàng)用于交互式執(zhí)行一些命令,在完成交互后 build 繼續(xù)進(jìn)行,在交互過程中進(jìn)行的操作都會(huì)被持久化到 鏡像中:

          限于篇幅原因,其他的具體指令請(qǐng)查閱官方文檔 Earthfile reference[3]

          3.3、UDCS

          UDCs 全稱 “User-defined commands”,即用戶定義指令;通過 UDCs 我們可以將 Earthfile 中特定的命令剝離出來,從而實(shí)現(xiàn)更加通用和統(tǒng)一的代碼復(fù)用;下面是一個(gè)定義 UDCs 指令的樣例:

          #?定義一個(gè)?Command
          #????注意:?語(yǔ)法必須滿足以下規(guī)則
          #?1、名稱全大寫
          #?2、名稱下劃線分割
          #?3、首個(gè)命令必須為?COMMAND(后面沒有冒號(hào))
          MY_COPY:
          ????COMMAND
          ????ARG?src
          ????ARG?dest=./
          ????ARG?recursive=false
          ????RUN?cp?$(if?$recursive?=??"true";?then?printf?--?-r;?fi)?"$src"?"$dest"

          #?target?中引用
          build:
          ????FROM?alpine:3.13
          ????WORKDIR?/udc-example
          ????RUN?echo?"hello"?>./foo
          ????#?通過?DO?關(guān)鍵字引用?UDCs
          ????DO?+MY_COPY?--src=./foo?--dest=./bar
          ????RUN?cat?./bar?#?prints?"hello"

          UDCs 不光可以定義在一個(gè) Earthfile 中,UDCs 可以跨文件、跨目錄引用:

          有了 UDCs 以后,我們可以通過這種方式將對(duì)基礎(chǔ)鏡像的版本統(tǒng)一控制、對(duì)特殊鏡像的通用處理等操作全部抽象出來,然后每個(gè) Earthfile 根據(jù)需要進(jìn)行引用;關(guān)于 UDCs 的使用樣例可以參考我的 autobuild[4] 項(xiàng)目,其中的 udcs[5] 目錄定義了大量的通用 UDCs,這些 UDCs 被其他目標(biāo)鏡的 Earthfile 批量引用。

          3.4、多平臺(tái)構(gòu)建

          在以前使用 Dockerfile 的時(shí)候,我們需要自己配置然后開啟 buildkit 來實(shí)現(xiàn)多平臺(tái)構(gòu)建;在配置過程中可能會(huì)很繁瑣,現(xiàn)在使用 earthly 可以默認(rèn)幫我們實(shí)現(xiàn)多平臺(tái)的交叉編譯,我們需要做的僅僅是在 Earthfile 中聲明需要支持哪些平臺(tái)而已:

          以上 Earthfile 在執(zhí)行 earthly --push +all 構(gòu)建時(shí),將會(huì)自動(dòng)構(gòu)建四個(gè)平臺(tái)的鏡像,并保持單個(gè) tag,同時(shí)由于使用了 --push 選項(xiàng)還會(huì)自動(dòng)推送到 Docker Hub 上:

          四、總結(jié)

          Earthly 彌補(bǔ)了 Dockerfile 的很多不足,解決了很多痛點(diǎn)問題;但同樣可能需要一些學(xué)習(xí)成本,但是如果已經(jīng)熟悉了 Dockerfile ?其實(shí)學(xué)習(xí)成本不高;所以目前還是比較推薦將 Dockerfile 切換為 Earthfile ?進(jìn)行統(tǒng)一和版本化管理的。本文由于篇幅所限(懶)很多地方?jīng)]有講,比如共享緩存等,所以關(guān)于 Earthly 更多的詳細(xì)使用等最好還是仔細(xì)閱讀一下官方文檔[6]

          引用鏈接

          [1]

          官方文檔: https://earthly.dev/get-earthly

          [2]

          官方文檔: https://docs.earthly.dev/docs/guides/auth

          [3]

          Earthfile reference: https://docs.earthly.dev/docs/earthfile

          [4]

          autobuild: https://github.com/mritd/autobuild

          [5]

          udcs: https://github.com/mritd/autobuild/tree/main/earthfiles/udcs

          [6]

          官方文檔: https://docs.earthly.dev/docs/guides

          原文鏈接:https://mritd.com/2021/10/27/the-best-image-build-tool-earthly/


          你可能還喜歡

          點(diǎn)擊下方圖片即可閱讀

          Debug 一個(gè)在 uWSGI 下使用 subprocess 卡住的問題

          云原生是一種信仰???

          關(guān)注公眾號(hào)

          后臺(tái)回復(fù)?k8s?獲取史上最方便快捷的 Kubernetes 高可用部署工具,只需一條命令,連 ssh 都不需要!



          點(diǎn)擊?"閱讀原文"?獲取更好的閱讀體驗(yàn)!


          發(fā)現(xiàn)朋友圈變“安靜”了嗎?

          瀏覽 72
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  超碰成人人人操 | 久久久六月 | 色逼逼综合网 | 中文字幕久久精品无码不卡 | 伊人高清无码 |