日日操夜夜添-日日操影院-日日草夜夜操-日日干干-精品一区二区三区波多野结衣-精品一区二区三区高清免费不卡

公告:魔扣目錄網(wǎng)為廣大站長(zhǎng)提供免費(fèi)收錄網(wǎng)站服務(wù),提交前請(qǐng)做好本站友鏈:【 網(wǎng)站目錄:http://www.ylptlb.cn 】, 免友鏈快審服務(wù)(50元/站),

點(diǎn)擊這里在線咨詢客服
新站提交
  • 網(wǎng)站:51998
  • 待審:31
  • 小程序:12
  • 文章:1030137
  • 會(huì)員:747

在本文,我將介紹幾種不用 Docker 就可以構(gòu)建容器的方法。我將以 OpenFaaS 作為參考案例,它的工作負(fù)載使用了 OCI 格式的容器鏡像。OpenFaaS 是 Kubernetes 的一個(gè) CaaS 平臺(tái),可以運(yùn)行微服務(wù)和添加 FaaS 及事件驅(qū)動(dòng)工具。

第一個(gè)示例將展示如何使用 Docker CLI 內(nèi)置的 buildkit 選項(xiàng),然后是單獨(dú)使用buildkit,最后是谷歌的容器構(gòu)建器Kaniko。

本文涉及的工具都是基于 Dockerfile 文件來構(gòu)建鏡像的,因此,任何限制用戶只能使用 JAVA (jib)或 Go (ko)的工具都不在討論范圍之內(nèi)。

Docker 有什么問題?

Docker 在 armhf、arm64 和x86_64平臺(tái)上運(yùn)行良好。Docker CLI 不僅用于構(gòu)建/發(fā)布/運(yùn)行鏡像,多年來它還背負(fù)了太多的東西,現(xiàn)在還與 Docker Swarm 和 Docker EE 特性捆綁在一起。

Docker 之外的選擇

有一些項(xiàng)目試圖讓“docker”回到它原本的組件身份,也就是我們最初都喜愛的用戶體驗(yàn):

  • Docker——Docker現(xiàn)在使用containerd來運(yùn)行容器,并且支持使用buildkit進(jìn)行高效的緩存式構(gòu)建。
  • Podman和buildah組合——由RedHat/IBM使用他們自己的OSS工具鏈來生成OCI鏡像。Podman是無守護(hù)進(jìn)程和無根的,但最后仍然需要掛載文件系統(tǒng)以及使用UNIX套接字。
  • pouch——來自阿里巴巴,被標(biāo)榜為“高效的企業(yè)級(jí)容器引擎”。它像Docker一樣,使用了containerd,并支持容器級(jí)別的隔離(runc)和“輕量級(jí)虛擬機(jī)”(如runV)。
  • 獨(dú)立版本的buildkit——buildkit是由Docker公司的Tonis Tiigi創(chuàng)建的,一個(gè)全新的具有緩存和并發(fā)支持的容器構(gòu)建器。buildkit目前僅作為守護(hù)進(jìn)程運(yùn)行,但你可能會(huì)聽到有人說不是這樣的。實(shí)際上,它會(huì)派生守護(hù)進(jìn)程,然后在構(gòu)建后將其終止。
  • img——img由Jess Frazelle開發(fā),對(duì)buildkit進(jìn)行了封裝。與其他工具相比,它并沒有更大的吸引力。在2018年下半年之前,這個(gè)項(xiàng)目一直很活躍,但之后只發(fā)布了幾個(gè)補(bǔ)丁。img聲稱自己是無守護(hù)進(jìn)程的,但它使用的是buildkit,所以這里有值得商榷的地方。我聽說img提供了比buildkit的CLI buildctr更好的用戶體驗(yàn),但需要注意的是,img只針對(duì)x86_64平臺(tái)發(fā)布了二進(jìn)制文件,不支持armhf/arm64。
  • k3c——使用containerd和buildkit重建初始Docker原始、經(jīng)典、樸素、輕量級(jí)的體驗(yàn)。

在所有的選項(xiàng)中,我最喜歡 k3c,但它使用起來比較繁瑣,它把所有東西都捆綁在一個(gè)二進(jìn)制文件中,這很可能會(huì)與其他軟件發(fā)生沖突。它運(yùn)行的是自己的嵌入式 containerd 和 buildkit 二進(jìn)制文件。

由于我們關(guān)注的是“構(gòu)建”部分以及相對(duì)穩(wěn)定的選項(xiàng),所以我們將著重看一下:

  • Docker的buildkit;
  • 單獨(dú)的buildkit;
  • kaniko。

由于 OpenFaaS CLI 可以輸出任意構(gòu)建器都可以使用的標(biāo)準(zhǔn)“構(gòu)建上下文”,所以上述的所有東西都可以實(shí)現(xiàn)。

構(gòu)建一個(gè)測(cè)試應(yīng)用程序

讓我們從一個(gè) Golang HTTP 中間件開始,并借此來展示 OpenFaaS 的通用性。

  • --lang指定構(gòu)建模板;
  • build-test是函數(shù)的名字;
  • --prefix是Docker Hub用戶名,用于推送我們的OCI鏡像。

我們將獲得以下這些內(nèi)容:

./
├── build-test
│   └── handler.go
└── build-test.yml


1 directory, 2 files

處理程序修改起來很容易,還可以通過 vendoring 或 Go 模塊來添加其他依賴項(xiàng)。

package function


import (
	"fmt"
	"io/ioutil"
	"net/http"
)


func Handle(w http.ResponseWriter, r *http.Request) {
	var input []byte


	if r.Body != nil {
		defer r.Body.Close()


		body, _ := ioutil.ReadAll(r.Body)


		input = body
	}


	w.WriteHeader(http.StatusOK)
	w.Write([]byte(fmt.Sprintf("Hello world, input was: %s", string(input))))
}

使用一般的方式構(gòu)建

構(gòu)建這個(gè)應(yīng)用程序的一般方式是這樣的:

faas-cli build -f build-test.yml

./template/golang-middleware/Dockerfile中包含了模板和 Dockerfile 的本地緩存。

這次構(gòu)建拉取了三個(gè)鏡像:

FROM openfaas/of-watchdog:0.7.3 as watchdog
FROM golang:1.13-alpine3.11 as build
FROM alpine:3.12

如果使用傳統(tǒng)的構(gòu)建器,將按順序拉取每個(gè)鏡像。

等一會(huì)兒構(gòu)建就完成了,現(xiàn)在本地庫(kù)中就有了構(gòu)建的鏡像。

我們還可以使用 faas-cli push -f build-test.yml將鏡像推到注冊(cè)表中。

不用Docker也能構(gòu)建容器的4種方法

 

使用 buildkit 和 Docker 構(gòu)建

這是最簡(jiǎn)單的做法,構(gòu)建起來也很快。

DOCKER_BUILDKIT=1 faas-cli build -f build-test.yml

我們可以看到,Docker 守護(hù)進(jìn)程會(huì)自動(dòng)切換到 buildkit 構(gòu)建器。

Buildkit 有很多優(yōu)點(diǎn):

  • 更復(fù)雜的緩存;
  • 如果可能的話,可以先運(yùn)行后面的指令——也就是說,可以在“sdk”層的構(gòu)建完成之前,下載“runtime”鏡像;
  • 在第二次構(gòu)建時(shí)速度超級(jí)快。

有了 buildkit,所有的基礎(chǔ)鏡像都可以一次性被拉取到本地庫(kù)中,因?yàn)?FROM(下載)命令不是按順序執(zhí)行的。

FROM openfaas/of-watchdog:0.7.3 as watchdog
FROM golang:1.13-alpine3.11 as build
FROM alpine:3.11

這個(gè)在 mac 上也可以使用,因?yàn)?buildkit 是由運(yùn)行在 VM 中 Docker 守護(hù)進(jìn)程負(fù)責(zé)代理的。

不用Docker也能構(gòu)建容器的4種方法

 

使用單獨(dú)的 buildkit 構(gòu)建

要單獨(dú)使用 buildkit 進(jìn)行鏡像構(gòu)建,我們需要在 linux 主機(jī)上單獨(dú)運(yùn)行 buildkit,因此不能使用 Mac。

faas-cli build通常會(huì)運(yùn)行或分叉出 docker,因?yàn)檫@個(gè)命令實(shí)際上只是一個(gè)包裝器。因此,為了繞過這種行為,我們需要?jiǎng)?chuàng)建一個(gè)構(gòu)建上下文,類似下面這樣:

faas-cli build -f build-test.yml --shrinkwrap


[0] > Building build-test.
Clearing temporary build folder: ./build/build-test/
Preparing ./build-test/ ./build/build-test//function
Building: alexellis2/build-test:latest with golang-middleware template. Please wait..
build-test shrink-wrApped to ./build/build-test/
[0] < Building build-test done in 0.00s.
[0] Worker done.


Total build time: 0.00

這個(gè)上下文可以在./build/build-test/文件夾中找到,其中包含了函數(shù)代碼和模板及其入口點(diǎn)和 Dockerfile。

./build/build-test/
├── Dockerfile
├── function
│   └── handler.go
├── go.mod
├── main.go
└── template.yml


1 directory, 5 files

現(xiàn)在我們需要運(yùn)行 buildkit,可以從源代碼開始構(gòu)建,或者從上游獲取二進(jìn)制文件。

curl -sSLf https://github.com/moby/buildkit/releases/download/v0.6.3/buildkit-v0.6.3.linux-amd64.tar.gz | sudo tar -xz -C /usr/local/bin/ --strip-components=1

如果你仔細(xì)看一下發(fā)布頁(yè),你會(huì)發(fā)現(xiàn) buildkit 也支持 armhf 和 arm64。

在新窗口中運(yùn)行 buildkit 守護(hù)進(jìn)程:

sudo buildkitd 
WARN[0000] using host network as the default            
INFO[0000] found worker "l1ltft74h0ek1718gitwghjxy", labels=map[org.mobyproject.buildkit.worker.executor:oci org.mobyproject.buildkit.worker.hostname:nuc org.mobyproject.buildkit.worker.snapshotter:overlayfs], platforms=[linux/amd64 linux/386] 
WARN[0000] skipping containerd worker, as "/run/containerd/containerd.sock" does not exist 
INFO[0000] found 1 workers, default="l1ltft74h0ek1718gitwghjxy" 
WARN[0000] currently, only the default worker can be used. 
INFO[0000] running server on /run/buildkit/buildkitd.sock 

現(xiàn)在我們開始構(gòu)建,并將配置文件的位置作為構(gòu)建上下文傳給它。我們需要 buildctl 命令,buildctl 是守護(hù)進(jìn)程的一個(gè)客戶端,它將指定如何構(gòu)建鏡像以及在構(gòu)建完成后應(yīng)該做什么,比如導(dǎo)成 tar、忽略構(gòu)建或?qū)⑵渫扑偷阶?cè)表。

buildctl build --help
NAME:
   buildctl build - build


USAGE:
   
  To build and push an image using Dockerfile:
    $ buildctl build --frontend dockerfile.v0 --opt target=foo --opt build-arg:foo=bar --local context=. --local dockerfile=. --output type=image,name=docker.io/username/image,push=true
  


OPTIONS:
   --output value, -o value  Define exports for build result, e.g. --output type=image,name=docker.io/username/image,push=true
   --progress value          Set type of progress (auto, plain, tty). Use plain to show container output (default: "auto")
   --trace value             Path to trace file. Defaults to no tracing.
   --local value             Allow build access to the local directory
   --frontend value          Define frontend used for build
   --opt value               Define custom options for frontend, e.g. --opt target=foo --opt build-arg:foo=bar
   --no-cache                Disable cache for all the vertices
   --export-cache value      Export build cache, e.g. --export-cache type=registry,ref=example.com/foo/bar, or --export-cache type=local,dest=path/to/dir
   --import-cache value      Import build cache, e.g. --import-cache type=registry,ref=example.com/foo/bar, or --import-cache type=local,src=path/to/dir
   --secret value            Secret value exposed to the build. Format id=secretname,src=filepath
   --allow value             Allow extra privileged entitlement, e.g. network.host, security.insecure
   --ssh value               Allow forwarding SSH agent to the builder. Format default|<id>[=<socket>|<key>[,<key>]]

我使用下面的命令獲得與 Docker 命令等價(jià)的效果:

sudo -E buildctl build --frontend dockerfile.v0 
 --local context=./build/build-test/ 
 --local dockerfile=./build/build-test/ 
 --output type=image,name=docker.io/alexellis2/build-test:latest,push=true

在運(yùn)行這個(gè)命令之前,你需要先運(yùn)行 docker login,或者使用一組有效的未加密憑證來創(chuàng)建 $HOME/.docker/config.json 文件。

不用Docker也能構(gòu)建容器的4種方法

 

使用 img 和 buildkit 構(gòu)建

由于我從未使用過 img,也沒有聽說有團(tuán)隊(duì)在大規(guī)模使用它,所以我想要嘗試一下。

首先它不支持多平臺(tái)架構(gòu),armhf 和 ARM64 平臺(tái)沒有對(duì)應(yīng)的二進(jìn)制文件,而且項(xiàng)目年齡不算短了,所以不太可能會(huì)提供多平臺(tái)支持。

x86_64平臺(tái)的最新版本是 2019 年 5 月 7 號(hào)的 v0.5.7,使用 Go 1.11 構(gòu)建:

sudo curl -fSL "https://github.com/genuinetools/img/releases/download/v0.5.7/img-linux-amd64" -o "/usr/local/bin/img" 
	&& sudo chmod a+x "/usr/local/bin/img"

它的構(gòu)建選項(xiàng)就像是 buildctl 的一個(gè)子集

img build --help
Usage: img build [OPTIONS] PATH


Build an image from a Dockerfile.


Flags:


  -b, --backend  backend for snapshots ([auto native overlayfs]) (default: auto)
  --build-arg    Set build-time variables (default: [])
  -d, --debug    enable debug logging (default: false)
  -f, --file     Name of the Dockerfile (Default is 'PATH/Dockerfile') (default: <none>)
  --label        Set metadata for an image (default: [])
  --no-cache     Do not use cache when building the image (default: false)
  --no-console   Use non-console progress UI (default: false)
  --platform     Set platforms for which the image should be built (default: [])
  -s, --state    directory to hold the global state (default: /home/alex/.local/share/img)
  -t, --tag      Name and optionally a tag in the 'name:tag' format (default: [])
  --target       Set the target build stage to build (default: <none>)

要構(gòu)建一個(gè)鏡像需要做這些事情:

sudo img build -f ./build/build-test/Dockerfile -t alexellis2/build-test:latest ./build/build-test/

由于這樣或那樣的原因,img 實(shí)際上沒能構(gòu)建成功。可能是因?yàn)樵噲D以非 root 用戶身份進(jìn)行一些優(yōu)化。

不用Docker也能構(gòu)建容器的4種方法

 

fatal error: unexpected signal during runtime execution
[signal SIGSEGV: segmentation violation code=0x1 addr=0xe5 pc=0x7f84d067c420]


runtime stack:
runtime.throw(0xfa127f, 0x2a)
	/home/travis/.gimme/versions/go1.11.10.linux.amd64/src/runtime/panic.go:608 +0x72
runtime.sigpanic()
	/home/travis/.gimme/versions/go1.11.10.linux.amd64/src/runtime/signal_unix.go:374 +0x2f2


goroutine 529 [syscall]:
runtime.cgocall(0xc9d980, 0xc00072d7d8, 0x29)
	/home/travis/.gimme/versions/go1.11.10.linux.amd64/src/runtime/cgocall.go:128 +0x5e fp=0xc00072d7a0 sp=0xc00072d768 pc=0x4039ee
os/user._Cfunc_mygetgrgid_r(0x2a, 0xc000232260, 0x7f84a40008c0, 0x400, 0xc0004ba198, 0xc000000000)

似乎已經(jīng)存在三個(gè)類似的問題。

使用 Kaniko 構(gòu)建

Kaniko 是谷歌的容器構(gòu)建器,旨在為容器構(gòu)建提供沙箱。你可以將其作為一次性容器,也可以將其作為獨(dú)立的二進(jìn)制文件。

docker run -v $PWD/build/build-test:/workspace 
 -v ~/.docker/config.json:/kaniko/config.json 
 --env DOCKER_CONFIG=/kaniko 
 gcr.io/kaniko-project/executor:latest 
 -d alexellis2/build-test:latest
  • -d指定在成功構(gòu)建后應(yīng)該將鏡像放在哪里。
  • -v將當(dāng)前目錄掛載到Kaniko容器中,還添加了config.json配置文件,指定將鏡像推送到哪個(gè)遠(yuǎn)程注冊(cè)表。
不用Docker也能構(gòu)建容器的4種方法

 

Kaniko 提供了緩存支持,但需要手動(dòng)管理和保存,因?yàn)?Kaniko 是在一次性模式下運(yùn)行的,不像 Buildkit 那樣是守護(hù)進(jìn)程。

以上各種工具的總結(jié)

  • Docker——傳統(tǒng)的構(gòu)建器

安裝 Docker 是個(gè)“大工程”,可能會(huì)給你的系統(tǒng)帶來比預(yù)想的要多得多的東西。Docker 構(gòu)建器是最古老的,也是最慢的。要注意在安裝 Docker 時(shí)附帶安裝的網(wǎng)橋,它可能會(huì)與使用相同私有 IP 段的其他私有網(wǎng)絡(luò)發(fā)生沖突。

  • Docker——與buildkit一起

這是最快的工具選擇,改動(dòng)最少,只需要加個(gè)DOCKER_BUILDKIT=1就可以啟用。

  • 單獨(dú)的buildkit

這個(gè)選項(xiàng)非常適合集群內(nèi)構(gòu)建,或者不需要 Docker 的系統(tǒng)(如 CI 或執(zhí)行器)。它需要 Linux 主機(jī),在 MacOS 上的使用體驗(yàn)太差,或許可以運(yùn)行一個(gè)額外的 VM 或主機(jī),然后通過 TCP 來訪問?

  • Kaniko

使用 Kaniko 仍然需要安裝 Docker,但不管怎樣,它畢竟提供了另一種選擇。

全文總結(jié)

你可以在 OpenFaaS 中使用普通的容器構(gòu)建器,也可以使用 faas-cli build --shrinkwrap,并將構(gòu)建上下文傳給首選工具。

下面是使用相應(yīng)工具構(gòu)建 OpenFaaS 容器的示例:

  • 谷歌云構(gòu)建
  • GitHub Actions
  • Jenkins
  • GitLab CI

在 OpenFaaS 云上,我們使用本文介紹的上下文傳遞方法和 buildkit 守護(hù)進(jìn)程提供了完全不需要人工干預(yù)的 CI/CD 構(gòu)建體驗(yàn)。對(duì)于其他用戶,我建議使用 Docker,或者帶有 buildkit 的 Docker。

你可以使用 GitHub 或 GitLab 集成構(gòu)建自托管的 OpenFaaS 云環(huán)境。

對(duì)于 faasd 用戶,你的主機(jī)上只安裝了 containerd,而沒有安裝 docker,所以最好的選擇是下載 buildkit。

原文鏈接:

https://blog.alexellis.io/building-containers-without-docker/

分享到:
標(biāo)簽:容器
用戶無頭像

網(wǎng)友整理

注冊(cè)時(shí)間:

網(wǎng)站:5 個(gè)   小程序:0 個(gè)  文章:12 篇

  • 51998

    網(wǎng)站

  • 12

    小程序

  • 1030137

    文章

  • 747

    會(huì)員

趕快注冊(cè)賬號(hào),推廣您的網(wǎng)站吧!
最新入駐小程序

數(shù)獨(dú)大挑戰(zhàn)2018-06-03

數(shù)獨(dú)一種數(shù)學(xué)游戲,玩家需要根據(jù)9

答題星2018-06-03

您可以通過答題星輕松地創(chuàng)建試卷

全階人生考試2018-06-03

各種考試題,題庫(kù),初中,高中,大學(xué)四六

運(yùn)動(dòng)步數(shù)有氧達(dá)人2018-06-03

記錄運(yùn)動(dòng)步數(shù),積累氧氣值。還可偷

每日養(yǎng)生app2018-06-03

每日養(yǎng)生,天天健康

體育訓(xùn)練成績(jī)?cè)u(píng)定2018-06-03

通用課目體育訓(xùn)練成績(jī)?cè)u(píng)定