日本免费高清视频-国产福利视频导航-黄色在线播放国产-天天操天天操天天操天天操|www.shdianci.com

學無先后,達者為師

網站首頁 編程語言 正文

Docker鏡像多架構構建介紹_docker

作者:小二上酒8 ? 更新時間: 2022-11-07 編程語言

前言:

目前arm系統越來越常見,對鏡像的多架構需求也越來越大。對于同一個鏡像,最簡單的辦法就是在amd64或arm機器上build后通過不同的tag進行區分,比如 nginx:v1-amd64 、 nginx:v1-arm64 ,但這種方式比較丑陋,而且沒有對應架構的機器用來構建怎么辦?

目前最新的辦法就是使用buildx來進行構建,不過這個特性目前默認是沒啟用的,需要在docker的配置文件中添加 "experimental": true 后重啟docker服務生效。

首先執行下面的命令讓amd64的機器也可以構建arm的鏡像:

docker run --rm --privileged tonistiigi/binfmt:latest --install all

然后創建一個新的build實例:

docker buildx create --use --name=mybuilder-cn --driver docker-container --driver-opt image=dockerpracticesig/buildkit:master

這樣準備工作就全都做好了。

接下來以一個kubebuilder命令創建的operator項目默認的Dockerfile為例:

# Build the manager binary
FROM --platform=$TARGETPLATFORM golang:1.16 as builder
ARG TARGETOS TARGETARCH
WORKDIR /workspace
# Copy the Go Modules manifests
COPY go.mod go.mod
COPY go.sum go.sum
# cache deps before building and copying source so that we don't need to re-download as much
# and so that source changes don't invalidate our downloaded layer
RUN go mod download

# Copy the go source
COPY main.go main.go
COPY api/ api/
COPY controllers/ controllers/

# Build
RUN CGO_ENABLED=0 GOOS=${TARGETOS} GOARCH=${TARGETARCH} go build -a -o manager main.go

# Use distroless as minimal base image to package the manager binary
# Refer to https://github.com/GoogleContainerTools/distroless for more details
FROM --platform=$TARGETPLATFORM gcr.io/distroless/static:nonroot
WORKDIR /
COPY --from=builder /workspace/manager .
USER 65532:65532

ENTRYPOINT ["/manager"]

修改點有2個:

--platform=$TARGETPLATFORM
GOOS=${TARGETOS} GOARCH=${TARGETARCH}

這些TARGET開頭的變量可以在參考鏈接2里看到全部含義。

接下來使用這個文件進行構建:

docker buildx build -t hello/namespace/name:v1 -f Dockerfile . --platform linux/amd64,linux/arm64 --push

注意這里的 buildx 、 --platform 參數后面跟隨需要構建的版本、以及 --push ,buildx構建的多架構鏡像要么使用這個參數push到鏡像倉庫,要么使用 --load 加載到本地,不可省略。

構建完成后就會生成相應的多架構鏡像了,可以使用 docker manifest inspect 來進行驗證,比如:

docker manifest inspect hello/namespace/name:v1
{
"schemaVersion": 2,
"mediaType": "application/vnd.docker.distribution.manifest.list.v2+json",
"manifests": [
{
"mediaType": "application/vnd.docker.distribution.manifest.v2+json",
"size": 1367,
"digest": "sha256:a7b99854e13939e3beaf21c1da8b4654022018eda9f438155b18ae16eeff49a5",
"platform": {
"architecture": "amd64",
"os": "linux"
}
},
{
"mediaType": "application/vnd.docker.distribution.manifest.v2+json",
"size": 2169,
"digest": "sha256:844885928813685ffa8c5ea4c6e9e7a09d95ac79e417afae0be7b73086762cfd",
"platform": {
"architecture": "arm64",
"os": "linux"
}
}
]
}

可以看出確實是生成了多個架構的鏡像,使用時直接在不同架構的機器上pull就會自動下載對應的架構鏡像了。或者也可以使用 docker pull --platform arm64|amd64 xxxxx 來指定拉取鏡像的架構。

對于某些沒有辦法使用buildx的場景,我們可以手動build不同架構的鏡像,然后再手動創建manifest,比如:

# 指定拉取amd64架構
docker pull --platform amd64 gcr.io/distroless/static:nonroot
# 重新打tag
docker tag 9ef34 hello/ns/static:nonroot-amd64
# 推送
docker push hello/ns/static:nonroot-amd64

# 指定拉取arm64架構
docker pull --platform arm64 gcr.io/distroless/static:nonroot
# 重新打tag
docker tag 91714 hello/ns/static:nonroot-arm64
# 推送
docker push hello/ns/static:nonroot-arm64

## 制作manifest
docker manifest create hello/ns/static:nonroot hello/ns/static:nonroot-amd64 hello/ns/static:nonroot-arm64
docker manifest push hello/ns/static:nonroot
docker manifest rm hello/ns/static:nonroot

重點是最后3行,push manifest后使用就和第一種方法一樣了。

另外如果想進行多架構構建有幾個注意點:

yum|apt install

其他 查看鏡像倉庫里都有哪些鏡像:

curl -u "用戶名":"密碼" -X GET http://鏡像地址:5000/v2/_catalog?n=2000 | python -m json.tool

查看鏡像有哪些tag:

curl -u "用戶名":"密碼" -X GET http://鏡像地址:5000/v2/命名空間/鏡像名稱/tags/list | python -m json.tool

原文鏈接:https://blog.51cto.com/u_15773567/5677884

欄目分類
最近更新