網站首頁 編程語言 正文
前言:
目前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-04-15 C語言各種操作符透徹理解上篇_C 語言
- 2022-10-12 深入淺出Golang中select的實現原理_Golang
- 2022-11-02 Pytest運行及其控制臺輸出信息_python
- 2022-09-09 如何通過pycharm實現對數據庫的查詢等操作(非多步操作)_python
- 2022-10-20 Swift協議Protocol介紹_Swift
- 2022-12-23 C語言例題之輸出1000以內的所有完數_C 語言
- 2022-09-27 淺談Redis緩存更新策略_Redis
- 2023-07-07 springboot優雅處理異常
- 最近更新
-
- 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同步修改后的遠程分支