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": [
### 解决方案 当遇到 `docker daemon error: failed to set up container networking network isolated not found` 的问题时,通常是因为尝试使用的自定义网络未被创建或者已被删除。以下是可能的原因分析以及解决方案: #### 原因一:目标网络不存在 如果在启动容器时指定了一个不存在的网络名称,则会触发此错误。例如,在运行以下命令时: ```bash docker run --network=isolated myimage ``` 如果没有提前通过 `docker network create isolated` 创建名为 `isolated` 的网络,就会报错。 **解决方法** 确保目标网络已存在并可用。可以通过以下命令验证是否存在该网络: ```bash docker network ls ``` 如果列表中没有找到对应的网络名称(如 `isolated`),则需要手动创建它: ```bash docker network create isolated ``` --- #### 原因二:网络被意外移除 即使之前已经创建过某个网络,但如果执行了 `docker network rm` 或者其他清理操作,可能会导致网络丢失。此时再次使用相同的网络名称也会引发类似的错误。 **解决方法** 重新创建所需的网络即可解决问题。例如: ```bash docker network create isolated ``` --- #### 原因三:拼写错误或大小写不一致 Docker 对网络名称区分大小写。因此,如果在网络名称中有任何拼写错误或大小写差异,也可能导致无法匹配到正确的网络资源。 **解决方法** 仔细检查所使用的网络名称是否完全一致。可以借助以下命令确认当前存在的网络及其确切命名方式: ```bash docker network inspect isolated ``` 如果返回为空说明网络确实缺失。 --- #### 原因四:覆盖网络中的特殊行为[^2] 对于某些高级类型的网络(例如 Overlay 网络),仅创建它们并不足以让容器自动加入其中。必须显式地将容器连接至这些特定网络。例如: ```bash docker network connect overlay mycontainer ``` 如果忽略这一步骤而直接试图访问此类复杂结构下的服务端点,就可能出现异常状况。 **解决方法** 针对非桥接模式的标准情况之外的操作场景,请按照官方文档指导完成额外设置步骤后再试运行应用实例。 --- #### 脚本环境配置不当[^3] 有时 CI/CD 流程里涉及动态生成镜像文件再部署的过程当中也容易因为基础依赖关系处理不好而出岔子比如缺少必要的 service 定义等都会间接影响最终效果呈现出来表现为各种奇怪的表现形式之一就是上述提到过的现象发生几率较高一些特别需要注意的是 GitLab Runner 中启用 DinD (Docker-in-Docker) 方式的正确做法应该遵循最佳实践指南来构建整个流水线架构从而减少不必要的麻烦事前预防总比事后补救要好得多啊朋友们! **建议调整后的 `.gitlab-ci.yml` 文件片段如下所示:** ```yaml image: docker:stable-golang services: - docker:dind variables: DOCKER_TLS_CERTDIR: "" before_script: - apk add --no-cache python3 py-pip - pip install docker-compose==1.29.2 build_job: stage: build script: - echo "Building Docker Image..." - docker info - docker pull $CI_REGISTRY_IMAGE || true - docker build --cache-from=$CI_REGISTRY_IMAGE -t $CI_REGISTRY_IMAGE . - docker push $CI_REGISTRY_IMAGE ``` 以上更改有助于改善潜在的风险因素同时提高整体稳定性表现水平达到预期目的为止哦亲们😊 --- ### 总结 综上所述,主要可以从以下几个方面入手排查并修复这个问题: 1. **核实网络状态** —— 利用 `docker network ls` 和 `docker network inspect` 查看现有网络详情; 2. **重建必要组件** —— 如果发现关键部分遗失的话及时补充回来就好啦; 3. **修正脚本逻辑缺陷** —— 特别是在自动化工具链环节里面更要小心谨慎对待每一个细节之处才不会轻易呢😄 希望以上的解答能够帮助您顺利排除故障恢复正常使用体验哈~ 😊 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值