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.mzph.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…