網站首頁 編程語言 正文
前言:
目前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
相關推薦
- 2022-02-11 SQL server 數據庫導入(附加)和分離 && 數據庫分離之后位置 &
- 2022-09-22 右值引用(C++11)
- 2023-11-11 tensorflow分布式報錯:tensorflow.python.framework.errors
- 2022-07-16 (ES6以上以及TS) Map對象轉數組
- 2022-04-17 彈性布局 怎么讓某一列自適應元素內容的寬度
- 2022-11-25 k8s?中的?service?如何找到綁定的?Pod?及實現?Pod?負載均衡的方法_云其它
- 2022-05-06 Python?Pandas條件篩選功能_python
- 2023-05-22 關于PyTorch中nn.Module類的簡介_python
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支