Docker多架構鏡像構建踩坑記

背景

公司為了做信創項目的亮點,需要將現有的一套在X86上運行的應用系統遷移到ARM服務器上運行,整個項目通過后端Java,前端VUEJS開發通過CICD做成Docker鏡像在K8S里面運行。但是當前的CICD產品不支持ARM的鏡像構建,于是只能手工構建ARM鏡像。以下是一些踩坑的記錄,希望能幫大家少踩坑

構建環境

  • 本地電腦 Deepin Linux 23 (Windows的WSL和其他的Linux系統都可以),X86_64架構
  • Docker鏡像的本地代理,使用v2ray啟的socks5://10.32.4.150:10808
  • 自建的Harbor倉庫,地址: harbor.wldc.site

目標

通過本地制作一個雙架構的應用運行基礎鏡像,并推送到harbor倉庫中

步驟

  1. 在本地電腦上安裝docker-ce,我是Deepin的系統可以直接運行以下命令安裝,其它的系統安裝方式,大家百度以下。
sudo apt update
sudo apt install -y apt-transport-https ca-certificates curl software-properties-common
curl -fsSL https://download.docker.com/linux/debian/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/debian $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list
#提示: 如果 $(lsb_release -cs) 返回的不是 buster 或 bullseye,可以手動替換為 buster 或 bullseye,這里我是替換了的
echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/debian bullseye stable" | sudo tee /etc/apt/sources.list.d/docker.list
sudo apt update
sudo apt install -y docker-ce docker-ce-cli containerd.io
sudo systemctl start docker
sudo systemctl enable docker
  1. 配置docker,由于國內的環境,docker的使用目前非常的不友好,就是這個代理就踩了非常多的坑,還有就是https,http,證書受信等各種坑,都踩過了。這里一次性把docker的配置都貼了,也不知道是那個配置文件解決的問題。為了避免浪費時間,建議大家抄配置。
    /etc/docker/daemon.json
#以下文件10.32.4.150是本地電腦的IP地址,運行的socks5代理
{"insecure-registries": ["10.159.16.19","harbor.wldc.site"],"proxies": {"http-proxy": "socks5://10.32.4.150:10808","https-proxy": "socks5://10.32.4.150:10808","no-proxy": "11.0.0.0/8,10.0.0.0/8,.example.org,127.0.0.0/8,.cn-southwest-2.myhuaweicloud.com,10.159.16.19,.wldc.site"}}

/etc/systemd/system/docker.service.d/http-proxy.conf

[Service]
Environment="HTTP_PROXY=socks5://10.32.4.150:10808"
Environment="HTTPS_PROXY=socks5://10.32.4.150:10808"
Environment="NO_PROXY=localhost,127.0.0.1,.wldc.site"

~/.docker/config.json

{"auths": {"harbor.wldc.site": {"auth": "YWRtaW46TUxYWFVSS1lncVdrdjdrbQ=="},"https://index.docker.io/v1/": {"auth": "a2V2aW5ua********A2MzkxOQ=="}},
"proxies": {"default": {"httpProxy": "http://10.32.4.150:10808","httpsProxy": "http://10.32.4.150:10808","noProxy": "localhost,127.0.0.1,.wldc.site"}
}
}

上面3個文件配置完成以后,重啟docker服務

systemctl daemon-reload && systemctl restart docker
  1. 創建docker的多架構builder,默認的builder只支持和宿主機一樣的架構鏡像,高版本的docker(>=19)默認也安裝了buildx的插件。
#創建命令
docker buildx create --use --bootstrap --name multiarch \--platform linux/amd64,linux/arm64 \--buildkitd-flags '--allow-insecure-entitlement network.host' \--buildkitd-config ./buildkitd.toml \--driver docker-container \--driver-opt image=buildkit:buildx-stable-2 \--driver-opt env.HTTP_PROXY=socks5://10.32.4.150:10808 \--driver-opt env.HTTPS_PROXY=socks5://10.32.4.150:10808 \--driver-opt env.NO_PROXY=.wldc.site \--driver-opt env.http_proxy=socks5://10.32.4.150:10808 \--driver-opt env.https_proxy=socks5://10.32.4.150:10808 \--driver-opt env.no_proxy=.wldc.site 

以上的命令說明:

* --buildkitd-flags,這個參數影響非https的harbor的鏡像推送
* --buildkitd-config ,這個參數是多架構構建builder的配置文件,詳細的配置可以參考https://github.com/moby/buildkit/blob/master/docs/buildkitd.toml.md ,我就配置了一個鏡像倉庫非https,不然推送鏡像的時候要報錯
* --driver ,這個參數和后面的--driver-opt聯合,主要是解決鏡像代理拉去以及非https的問題
* --driver-opt image=buildkit:buildx-stable-2 ,這個是使用的builder的鏡像,這個參數如果不添加,默認使用的moby/buildkit:buildx-stable-1,并且從dockerhub上面去拉。如果本地網絡不通,就拉不了鏡像,或者要做定制化,就手動本地打包一下鏡像。

buildkitd.toml 文件內容

insecure-entitlements = [ "harbor.wldc.site", "10.159.16.19" ]
[registry."harbor.wldc.site"]http = trueinsecure = true
  1. 確認多架構的builder運行成功
#命令 docker buildx ls
NAME/NODE        DRIVER/ENDPOINT                   STATUS    BUILDKIT   PLATFORMS
multiarch*       docker-container                                       \_ multiarch0    \_ unix:///var/run/docker.sock   running   v0.18.1    linux/amd64*, linux/arm64*, linux/amd64/v2, linux/amd64/v3, linux/386
default          docker                                                 \_ default       \_ default                       running   v0.16.0    linux/amd64, linux/amd64/v2, linux/amd64/v3, linux/386
  1. 通過Dockerfile構建多架構鏡像,并推送到自建的harbor里面
export BUILDKIT_NO_CLIENT_TOKEN=1 #這個必須要運行,不然builder會去連接docker的auth服務,這個坑花了我很多時間。最后在這里找到了:https://forums.docker.com/t/docker-build-fails-while-docker-pull-works-as-expected/144116/5
docker buildx build  --platform=linux/amd64,linux/arm64  \
--network host \
--add-host harbor.wldc.site:10.159.16.19 \
--build-arg HTTP_PROXY=socks5://10.32.4.150:10808  \
--build-arg HTTPS_PROXY=socks5://10.32.4.150:10808  \
--build-arg NO_PROXY=localhost,127.0.0.1,.wldc.site  \
--build-arg http_proxy=socks5://10.32.4.150:10808  \
--build-arg https_proxy=socks5://10.32.4.150:10808  \
--build-arg no_proxy=localhost,127.0.0.1,.wldc.site  \
--push  -t harbor.wldc.site/base/openeuler:22.03-lts-sp4 .

畫重點
如果harbor是用的域名訪問,需要把這個域名寫入到運行的builder的容器里面,宿主機配置了host不管用,–add-host 參數也不管用,如果大家發現了有其它的方法請留言給我,謝謝。以下是部署

root@KevinLiu-PC:/tmp# docker ps
CONTAINER ID   IMAGE                      COMMAND                   CREATED             STATUS             PORTS     NAMES
9b774b15a81f   buildkit:buildx-stable-2   "buildkitd --config …"   About an hour ago   Up About an hour             buildx_buildkit_multiarch0
root@KevinLiu-PC:/tmp# docker exec -it  9b774b15a81f sh
/ # cat /etc/hosts
127.0.0.1       localhost
::1     localhost ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
172.17.0.2      9b774b15a81f
10.159.16.19 harbor.wldc.site
/ # 
  1. 登錄harbor檢測推送的多架構的鏡像
    在這里插入圖片描述

總結

在多架構構建的過程中遇到了很多問題,都于網絡有關,目前國內的情況就是這樣,沒有辦法。同時多架構的鏡像構建,對于Dockerfile也有要求,針對Java這種語言,已經有JVM做了跨平臺,編譯出來的制品可以直接跨平臺;但是如果是golang的應用,在編譯和Dockerfile的時候都要獨立處理。比如如下的Dockerfile,最后希望大家少踩坑。

# 第一步:構建階段,在構建的時候buildx會同時拉兩種架構的鏡像
FROM  golang:1.18-alpine AS builder
# 設置環境變量
ENV CGO_ENABLED=0 \GOOS=linux \GO111MODULE=on
# 聲明用于判斷架構的參數
ARG TARGETARCH
# 工作目錄
WORKDIR /app
# 拷貝源代碼
COPY . .
# 下載依賴
RUN go mod tidy
# 針對不同架構執行操作,如果有特殊處理,可以在這個判斷里面事項。當然如果Dockerfile具有通用性,可以不做判斷
RUN if [ "$TARGETARCH" = "amd64" ]; then \echo "Building for amd64..."; \elif [ "$TARGETARCH" = "arm64" ]; then \echo "Building for arm64..."; \fi# 構建應用,不同的鏡像打出來的二進制文件不一樣
go build -o main .
# 第二步:運行階段
FROM alpine:latest
# 安裝時區數據和證書
RUN apk add --no-cache ca-certificates tzdata
# 設置工作目錄
WORKDIR /root/
# 從構建階段復制可執行文件
COPY --from=builder /app/main .
# 暴露端口(可選)
EXPOSE 8080
# 啟動容器
CMD ["./main"]
#構建命令示例
docker buildx build --platform linux/amd64,linux/arm64 -t harbor.wldc.site/dev/demo:v1.0.0 -f Dockerfile .

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/62144.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/62144.shtml
英文地址,請注明出處:http://en.pswp.cn/web/62144.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

python學opencv|讀取圖像(三)放大和縮小圖像

【1】引言 前序已經學習了常規的圖像讀取操作和圖像保存技巧,相關文章鏈接為: python學opencv|讀取圖像-CSDN博客 python學opencv|讀取圖像(二)保存彩色圖像-CSDN博客 今天我們更近一步,學習放大和縮小圖像的技巧&…

D86【python 接口自動化學習】- pytest基礎用法

day86 pytest配置testpaths 學習日期:20241202 學習目標:pytest基礎用法 -- pytest配置testpaths 學習筆記: pytest配置項 主目錄創建pytest.ini文件 [pytest] testpaths./testRule 然后Terminal里直接命令:pytest&#xff…

基于 Apache Dolphinscheduler3.1.9中的Task 處理流程解析

實現一個調度任務,可能很簡單。但是如何讓工作流下的任務跑得更好、更快、更穩定、更具有擴展性,同時可視化,是值得我們去思考得問題。 Apache DolphinScheduler是一個分布式和可擴展的開源工作流協調平臺,具有強大的DAG可視化界…

藍橋杯2117砍竹子(簡單易懂 包看包會版)

問題描述 這天, 小明在砍竹子, 他面前有 n 棵竹子排成一排, 一開始第 i 棵竹子的 高度為 hi?. 他覺得一棵一棵砍太慢了, 決定使用魔法來砍竹子。魔法可以對連續的一 段相同高度的竹子使用, 假設這一段竹子的高度為 H, 那么 用一次魔法可以 把這一段竹子的高度都變為 ?H2?…

如何進行 JavaScript 性能優化?

要進行 JavaScript 性能優化,我們可以從多個角度進行思考,主要包括減少頁面渲染時間、減少內存占用、優化代碼執行效率等。以下是優化的一些方法,并結合實際項目代碼示例講解。 目錄結構 減少 DOM 操作 緩存 DOM 元素批量更新 DOM 優化 Jav…

CTF-PWN: 全保護下格式化字符串利用 [第一屆“吾杯”網絡安全技能大賽 如果能重來] 賽后學習(不會)

通過網盤分享的文件:如果能重來.zip 鏈接: https://pan.baidu.com/s/1XKIJx32nWVcSpKiWFQGpYA?pwd1111 提取碼: 1111 --來自百度網盤超級會員v2的分享漏洞分析 格式化字符串漏洞,在printf(format); __int64 sub_13D7() {char format[56]; // [rsp10h] [rbp-40h]…

selenium-常見問題解決方案匯總

selenium-常見問題解決方案 selenium版本selenium代理本地瀏覽器頁面Selenium之多窗口句柄的切換 selenium版本 selenium版本為: 3.141.0 注:selenium4x跟selenium3x會有不同的使用方法, selenium代理本地瀏覽器頁面 利用 Selenium 庫實現對 Google C…

Flask使用長連接

Flask使用flask_socketio實現websocket Python中的單例模式 在HTTP通信中,連接復用(Connection Reuse)是一個重要的概念,它允許客戶端和服務器在同一個TCP連接上發送和接收多個HTTP請求/響應,而不是為每個新的請求/響…

雨晨 26100.2454 Windows 11 24H2 專業工作站 極簡純凈版

文件: 雨晨 26100.2454 Windows 11 24H2 專業工作站極簡 install.esd 大小: 1947043502 字節 修改時間: 2024年12月6日, 星期五, 16:38:37 MD5: 339B7FDCA0130D432A0E98957738A9DD SHA1: 2978AE0CEAF02E52EC4135200D4BDBC861E07BE8 CRC32: 8C329C89 簡述: 由YCDIS…

[docker中首次配置git環境與時間同步問題]

11月沒寫東西,12月初趕緊水一篇。 剛開始搭建docker服務器時,網上找一堆指令配置好git后,再次新建容器后忘記怎么配了,,這次記錄下。 一、git ssh指令法,該方法不用每次提交時輸入密碼 前期準備&#xff0…

MongoDB性能監控工具

mongostat mongostat是MongoDB自帶的監控工具,其可以提供數據庫節點或者整個集群當前的狀態視圖。該功能的設計非常類似于Linux系統中的vmstat命令,可以呈現出實時的狀態變化。不同的是,mongostat所監視的對象是數據庫進程。mongostat常用于…

linux下的python打包

linux下的python打包 一、pyinstaller 優點:打包簡單,將整個運行環境進行打包 缺點:打包文件大、臃腫、啟動慢 安裝pyinstaller包 pip install pyinstaller 打包一個文件 pyinstaller -D app.py會在當前路徑中生成build、dist文件夾還有…

Python模塊之random、hashlib、json、time等內置模塊語法學習

Python內置模塊語法學習 random、hashlib、json、time、datetime、os等內置模塊語法學習 模塊 簡單理解為就是一個.py后綴的一個文件 分為三種: 內置模塊:python自帶,可調用第三方模塊:別人設計的,可調用自定義模塊…

從ctfwiki開始的pwn之旅 5.ret2csu

ret2csu 原理 在 64 位程序中,函數的前 6 個參數是通過寄存器傳遞的,但是大多數時候,我們很難找到每一個寄存器對應的 gadgets。 這時候,我們可以利用 x64 下的 __libc_csu_init 中的 gadgets。這個函數是用來對 libc 進行初始…

Ceph對象存儲

Ceph對象存儲1.概念對象存儲(Object Storage)是一種用于存儲大量非結構化數據的架構模型它使用簡單的HTTP或HTTPS協議進行文件訪問,而不是傳統的文件系統API與傳統的文件系統存儲方式不同,對象存儲不是將數據存儲在目錄或文件夾中…

嵌入式藍橋杯學習拓展 LCD翻轉顯示

通過配置SS和GS兩個標志位,實現掃描方向的切換。 將lcd.c的REG_932X_Init函數進行部分修改。 將LCD_WriteReg(R1, 0x0000);修改為LCD_WriteReg(R1,0x0100); 將LCD_WriteReg(R96, 0x2700); 修改為LCD_WriteReg(R96, 0xA700); void REG_932X_Init1(void) {LCD_Wr…

小程序 —— Day1

組件 — view和scroll-view view 類似于HTML中的div,是一個塊級元素 案例:通過view組件實現頁面的基礎布局 scroll-view 可滾動的視圖區域,用來實現滾動列表效果 案例:實現縱向滾動效果 scroll-x屬性:允許橫向滾動…

git pull error: cannot lock ref

Git: cannot lock ref ‘refs/remotes/origin/feature/xxx’: refs/remotes/origin/feature/xxx/car’ exists; cannot create refs/remotes/origin/feature/xxx git remote prune origin重新整理服務端和本地的關聯關系即可

pubmed關鍵詞搜索技能1:待更新

1,白話變為領域內學術詞: 例如,我想要做蛋白質糖基化修飾以功能,這個領域課題,則 第一性原理,首先是拆分詞匯:糖基化(一般比蛋白質、修飾、功能要在title中更常見,或者是…

iPhone手機清理軟件:相冊清理大師推薦

隨著智能手機成為我們日常生活的必需品,手機中的數據日益膨脹,尤其是照片和視頻這類容易積累的文件。對于iPhone用戶來說,管理這些文件,特別是清理相冊變得尤為重要。本文將介紹一款備受推崇的iPhone手機清理軟件——CleanMyPhone…