当前位置: 首页 > article >正文

第三部分-Dockerfile与镜像构建——14. 镜像构建优化

14. 镜像构建优化1. 优化概述镜像构建优化涵盖构建速度、镜像体积、安全性等多个维度。通过合理优化可以显著减少构建时间、降低存储成本、提升部署效率。┌─────────────────────────────────────────────────────────────┐ │ 镜像优化维度 │ ├─────────────────────────────────────────────────────────────┤ │ │ │ 构建速度优化 镜像体积优化 │ │ ┌─────────────────┐ ┌─────────────────┐ │ │ │ 利用构建缓存 │ │ 选择轻量基础镜像 │ │ │ │ 并行构建 │ │ 多阶段构建 │ │ │ │ BuildKit │ │ 合并RUN命令 │ │ │ │ 缓存镜像 │ │ 清理缓存 │ │ │ │ 本地仓库 │ │ 删除开发工具 │ │ │ └─────────────────┘ └─────────────────┘ │ │ │ │ 安全优化 可维护性优化 │ │ ┌─────────────────┐ ┌─────────────────┐ │ │ │ 最小权限 │ │ 标准化命名 │ │ │ │ 漏洞扫描 │ │ 添加标签 │ │ │ │ 镜像签名 │ │ 文档化 │ │ │ │ 依赖更新 │ │ 参数化配置 │ │ │ │ 安全配置 │ │ 版本控制 │ │ │ └─────────────────┘ └─────────────────┘ │ │ │ └─────────────────────────────────────────────────────────────┘2. 构建速度优化2.1 利用构建缓存# ✅ 优化层顺序稳定指令在前 FROM node:14-alpine # 先复制依赖文件变化频率低 WORKDIR /app COPY package*.json ./ # 安装依赖只有当 package.json 变化时才重建 RUN npm ci --onlyproduction # 后复制源代码变化频率高 COPY . . RUN npm run build CMD [node, dist/server.js]2.2 使用 BuildKit# 启用 BuildKitexportDOCKER_BUILDKIT1dockerbuild-tmyapp.# 或者在 Docker 配置中启用# /etc/docker/daemon.json{features:{buildkit:true}}# BuildKit 特性DOCKER_BUILDKIT1dockerbuild\--progressplain\--secretidnpmrc,src$HOME/.npmrc\.2.3 并行构建# 并行构建多个镜像forimageinservice1 service2 service3;dodockerbuild-t$image./$image# 后台并行构建donewait# 使用 docker buildx 并行构建多平台dockerbuildx build\--platformlinux/amd64,linux/arm64\-tmyapp:latest\--push.2.4 使用缓存镜像# 从远程仓库拉取缓存dockerpull myapp:cache||truedockerbuild --cache-from myapp:cache-tmyapp:latest.# 内联缓存导出dockerbuild --build-argBUILDKIT_INLINE_CACHE1-tmyapp:latest.# 独立缓存镜像dockerbuild\--cache-from myapp:cache\--targetbuilder\-tmyapp:cache.dockerpush myapp:cache2.5 使用本地镜像仓库# 搭建本地镜像仓库dockerrun-d-p5000:5000--nameregistry registry:2# 推送到本地仓库dockertag myapp localhost:5000/myappdockerpush localhost:5000/myapp# 从本地仓库拉取dockerpull localhost:5000/myapp3. 镜像体积优化3.1 基础镜像对比# 镜像大小参考 # ubuntu:22.04 → 77.8MB # debian:11-slim → 40.3MB # alpine:3.16 → 5.6MB # busybox:latest → 1.2MB # scratch → 0MB # ✅ 选择 alpine大多数场景 FROM alpine:3.16 RUN apk add --no-cache nginx # ✅ 静态编译使用 scratch FROM scratch COPY myapp /myapp CMD [/myapp]3.2 多阶段构建优化# 编译阶段 FROM golang:1.17-alpine AS builder WORKDIR /app COPY go.mod go.sum ./ RUN go mod download COPY . . RUN CGO_ENABLED0 GOOSlinux go build -ldflags-s -w -o main . # 运行阶段 FROM alpine:latest RUN apk --no-cache add ca-certificates # 只复制二进制文件 COPY --frombuilder /app/main /app/main ENTRYPOINT [/app/main]3.3 减少层数# ❌ 不好多个 RUN 创建多层 RUN apt-get update RUN apt-get install -y curl RUN apt-get install -y nginx RUN apt-get clean # ✅ 好合并为单层 RUN apt-get update \ apt-get install -y curl nginx \ apt-get clean \ rm -rf /var/lib/apt/lists/*3.4 清理临时文件# ✅ 好清理缓存 RUN apk add --no-cache nginx # ✅ 好删除临时文件 RUN apt-get update \ apt-get install -y build-essential \ make \ apt-get remove -y build-essential \ apt-get autoremove -y \ rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/*4. 构建参数优化4.1 使用构建参数# Dockerfile ARG NODE_VERSION14.17.0 ARG APP_HOME/app FROM node:${NODE_VERSION}-alpine WORKDIR ${APP_HOME} # 构建时传入 # docker build --build-arg NODE_VERSION16.0.0 -t myapp .4.2 条件构建# 根据参数选择不同行为 ARG ENVIRONMENTproduction FROM alpine:3.16 RUN if [ $ENVIRONMENT development ]; then \ apk add --no-cache vim bash; \ fi5. 依赖管理优化5.1 锁定依赖版本# ✅ 好使用具体版本 FROM python:3.9-slim COPY requirements.txt ./ RUN pip install --no-cache-dir -r requirements.txt # requirements.txt # requests2.26.0 # flask2.0.15.2 分层安装依赖# ✅ 好分层安装缓存利用 FROM node:14-alpine # 先复制锁文件 COPY package-lock.json ./ RUN npm ci --onlyproduction # 需要编译的包单独层 COPY package.json ./ RUN npm install --onlyproduction6. 网络优化6.1 使用国内镜像源# ✅ 使用阿里云镜像加速 FROM alpine:3.16 RUN sed -i s/dl-cdn.alpinelinux.org/mirrors.aliyun.com/g /etc/apk/repositories RUN apk add --no-cache nginx # ✅ Python 使用清华源 FROM python:3.9-slim RUN pip install -i https://pypi.tuna.tsinghua.edu.cn/simple flask6.2 代理配置# 构建时使用代理 # docker build --build-arg HTTP_PROXYhttp://proxy:8080 . ARG HTTP_PROXY ARG HTTPS_PROXY RUN export HTTP_PROXY$HTTP_PROXY \ export HTTPS_PROXY$HTTPS_PROXY \ curl -sSL https://example.com/file7. 存储优化7.1 清理 Docker 构建缓存# 查看构建缓存使用dockersystemdf# 清理构建缓存dockerbuilder prune# 清理所有构建缓存dockerbuilder prune-a# 设置缓存大小限制# /etc/docker/daemon.json{builder:{gc:{enabled:true,defaultKeepStorage:20GB}}}7.2 减少层的大小# ❌ 不好两层都包含大文件 COPY huge-file.zip . RUN unzip huge-file.zip rm huge-file.zip # ✅ 好ADD 自动解压不保留压缩包 ADD huge-file.zip /app/8. 安全优化8.1 依赖漏洞扫描# 使用 Docker Scandockerscan myapp:latest# 使用 Trivytrivy image myapp:latest# 使用 Clairclair-scanner myapp:latest8.2 镜像签名# 启用 Docker Content TrustexportDOCKER_CONTENT_TRUST1# 推送签名镜像dockerpush myapp:latest# 拉取验证签名dockerpull myapp:latest9. 构建工具对比工具特点适用场景docker build原生支持简单构建docker buildx多平台、BuildKit生产环境kaniko无需守护进程Kubernetesbuildah无守护进程CI/CDpodman build兼容 DockerRHEL 环境10. CI/CD 优化10.1 GitLab CI 优化# .gitlab-ci.ymlvariables:DOCKER_BUILDKIT:1BUILDKIT_INLINE_CACHE:1build:stage:buildscript:-docker pull $CI_REGISTRY_IMAGE:cache||true-docker build--cache-from $CI_REGISTRY_IMAGE:cache--tag $CI_REGISTRY_IMAGE:latest--tag $CI_REGISTRY_IMAGE:$CI_COMMIT_SHA .-docker push $CI_REGISTRY_IMAGE:latest-docker push $CI_REGISTRY_IMAGE:$CI_COMMIT_SHA-docker tag $CI_REGISTRY_IMAGE:latest $CI_REGISTRY_IMAGE:cache-docker push $CI_REGISTRY_IMAGE:cache10.2 GitHub Actions 优化# .github/workflows/build.ymlname:Build and Pushon:[push]jobs:build:runs-on:ubuntu-lateststeps:-uses:actions/checkoutv2-name:Set up Docker Buildxuses:docker/setup-buildx-actionv1-name:Cache Docker layersuses:actions/cachev2with:path:/tmp/.buildx-cachekey:${{runner.os}}-buildx-${{github.sha}}restore-keys:|${{ runner.os }}-buildx--name:Build and pushuses:docker/build-push-actionv2with:push:truetags:myapp:latestcache-from:typelocal,src/tmp/.buildx-cachecache-to:typelocal,dest/tmp/.buildx-cache11. 监控与调试11.1 查看构建详情# 查看构建历史dockerhistorymyapp:latest# 查看层大小dockerhistorymyapp:latest--format{{.Size}}# 使用 dive 分析镜像dockerrun--rm-it\-v/var/run/docker.sock:/var/run/docker.sock\wagoodman/dive:latest myapp:latest11.2 构建性能分析# 启用 BuildKit 进度DOCKER_BUILDKIT1dockerbuild--progressplain-tmyapp.# 分析构建时间timedockerbuild-tmyapp.# 查看构建缓存使用dockerbuilder debug12. 优化检查清单## 构建优化检查清单 ### 构建速度 - [ ] 优化层顺序稳定指令在前 - [ ] 启用 BuildKit - [ ] 使用缓存镜像 - [ ] 配置本地镜像仓库 - [ ] 并行构建多个镜像 ### 镜像体积 - [ ] 使用 alpine/slim 基础镜像 - [ ] 实施多阶段构建 - [ ] 合并 RUN 命令 - [ ] 清理缓存和临时文件 - [ ] 删除开发工具 ### 依赖管理 - [ ] 锁定依赖版本 - [ ] 分层安装依赖 - [ ] 使用国内镜像源 ### 安全 - [ ] 扫描漏洞 - [ ] 更新基础镜像 - [ ] 签名镜像 ### CI/CD - [ ] 缓存 Docker 层 - [ ] 使用 BuildKit - [ ] 推送缓存镜像13. 小结构建速度利用缓存、BuildKit、并行构建镜像体积轻量基础镜像、多阶段构建、合并 RUN依赖管理版本锁定、分层安装网络优化国内镜像源、代理配置安全优化漏洞扫描、镜像签名CI/CD 集成层缓存、缓存镜像推送监控工具dive、docker history定期清理构建缓存节省磁盘空间

相关文章:

第三部分-Dockerfile与镜像构建——14. 镜像构建优化

14. 镜像构建优化 1. 优化概述 镜像构建优化涵盖构建速度、镜像体积、安全性等多个维度。通过合理优化,可以显著减少构建时间、降低存储成本、提升部署效率。 ┌────────────────────────────────────────────────…...

基因组学算法在量化交易中的应用:序列比对与演化优化实战

1. 项目概述:当基因组学遇上量化交易看到dc63265065/genome-trader-lab这个项目标题,我的第一反应是:这绝对是一个充满想象力、试图在生物学和金融学这两个看似风马牛不相及的领域之间架起桥梁的硬核项目。它不是一个简单的工具库&#xff0c…...

AIHawk求职自动化智能体:基于Selenium与LLM的网页自动化实战解析

1. AIHawk:一个求职自动化AI智能体的深度拆解与实战最近在GitHub上看到一个挺有意思的项目,叫AIHawk,号称是“第一个求职申请AI网页智能体”。简单来说,它就是一个能自动帮你浏览招聘网站、分析职位描述、然后替你填写申请表和投递…...

项目感知编辑器配置切换:告别混乱全局配置,实现开发环境一键切换

1. 项目概述与核心价值最近在折腾开发环境,尤其是涉及到不同项目、不同编程语言切换的时候,一个老问题又冒出来了:如何让我的编辑器或IDE的配置,能像换衣服一样,根据当前打开的项目自动切换?比如&#xff0…...

库存表的强一致性

库存表强一致性:基于副本策略的实现与读写规则设计 在分布式系统中,库存表是典型的对一致性要求极高的数据模型。任何不一致都可能导致超卖、数据错乱甚至资损。通过合理的数据副本策略,可以在保证强一致性的前提下,兼顾可用性与性能。 一、强一致性的目标定义 强一致性…...

基于 GTID 的故障转移

当主库宕机,基于传统日志点位(binlog+position)的复制在进行故障转移时,其核心难点在于:你不仅要确保所有从库与新的主库数据同步,还要在纷繁的日志文件中,为每一个从库重新计算出一个精准且唯一的同步位点。这一过程极易因操作失误或日志文件轮转,导致主从数据不一致甚…...

基于大语言模型的浏览器智能体:从原理到工程实践

1. 项目概述:一个能自主操作浏览器的智能体最近在开源社区里,一个名为“AgenticA5/A5-Browser-Use”的项目引起了我的注意。简单来说,这是一个能够模拟人类行为、自主操作网页浏览器的智能体(Agent)。它不像传统的自动…...

JetBrains IDE试用期重置终极指南:告别30天限制的完整解决方案

JetBrains IDE试用期重置终极指南:告别30天限制的完整解决方案 【免费下载链接】ide-eval-resetter 项目地址: https://gitcode.com/gh_mirrors/id/ide-eval-resetter 作为一名开发者,你是否曾因JetBrains IDE试用期到期而中断开发节奏&#xff…...

3分钟解决JetBrains IDE试用期到期问题:ide-eval-resetter完全指南

3分钟解决JetBrains IDE试用期到期问题:ide-eval-resetter完全指南 【免费下载链接】ide-eval-resetter 项目地址: https://gitcode.com/gh_mirrors/id/ide-eval-resetter 你是否曾经在专注编码时,突然被JetBrains IDE的试用期到期通知打断&…...

基于Redis向量数据库的arXiv论文语义搜索引擎实战

1. 项目概述:构建一个基于语义的学术论文搜索引擎如果你经常在arXiv上找论文,肯定有过这样的体验:面对海量的预印本,用关键词搜索出来的结果要么不相关,要么漏掉了真正重要的文献。传统的基于关键词匹配的搜索&#xf…...

Cursor云智能体HTTP客户端库:专为Serverless优化的axios封装方案

1. 项目概述:一个专为Cursor云智能体设计的HTTP客户端库最近在折腾Cursor的云智能体(Cloud Agents)时,发现一个挺普遍的需求:如何让智能体稳定、高效地与外部API进行通信?无论是调用OpenAI的接口、查询天气…...

NeuralBridge:AI工作流轻量级集成枢纽的设计与实战

1. 项目概述:一个为AI工作流打造的轻量级集成枢纽如果你正在尝试将AI驱动的智能体(比如基于LangChain、AutoGPT构建的应用)连接到外部的数据库、API或者SaaS服务,大概率会遇到一个头疼的问题:集成工作既繁琐又重复。每…...

阿里AgentEvolver框架解析:让AI智能体实现自我进化的三大核心机制

1. 项目概述:AgentEvolver,一个让智能体学会“自我进化”的框架如果你和我一样,长期在AI智能体(Agent)这个领域里摸爬滚打,那你一定对一个问题深有感触:训练一个真正能打、能适应复杂任务的智能…...

CursorGothic 字体深度解析:从设计理念到全开发环境配置指南

1. 项目概述:CursorGothic 字体家族如果你和我一样,日常重度依赖 Cursor 这款 AI 驱动的代码编辑器,那么你大概率已经注意到了它界面中那个极具辨识度的等宽字体。没错,那就是 Cursor 自带的专属字体——CursorGothic。它不仅仅是…...

Godot Script IDE插件:GDScript开发效率革命,从编辑器到轻量IDE

1. 项目概述:从编辑器到IDE的进化如果你和我一样,长期使用Godot引擎进行开发,那么对内置的脚本编辑器一定又爱又恨。它简洁、轻量,启动飞快,但在处理大型项目、需要频繁在多个脚本间跳转、或者想快速定位一个特定变量或…...

AI自动化报告生成:从数据到文档的智能解决方案

1. 项目概述:告别手动填表,让AI帮你写报告如果你和我一样,每周、每月都要花上几个小时,对着Excel表格和PPT模板,绞尽脑汁地“攒”出一份商务报告,那么今天分享的这个工具,可能会让你眼前一亮。它…...

CANN/cannbot-skills: easyasc DSL转AscendC工作流

ops-easyasc-dsl 【免费下载链接】cannbot-skills CANNBot 是面向 CANN 开发的用于提升开发效率的系列智能体,本仓库为其提供可复用的 Skills 模块。 项目地址: https://gitcode.com/cann/cannbot-skills English README 有天我一拍脑袋想看看 AI 究竟能做成…...

ARM调试寄存器DBGBCR_EL1与DBGBVR_EL1详解与应用

1. ARM调试寄存器架构概述在ARMv8/v9架构中,调试寄存器是实现硬件级调试功能的核心组件。作为一位长期从事ARM平台底层开发的工程师,我经常需要与DBGBCR_EL1和DBGBVR_EL1这类调试寄存器打交道。它们构成了处理器调试子系统的基础设施,为开发者…...

CANN/asc-devkit AddRelu算子API

AddRelu 【免费下载链接】asc-devkit 本项目是CANN 推出的昇腾AI处理器专用的算子程序开发语言,原生支持C和C标准规范,主要由类库和语言扩展层构成,提供多层级API,满足多维场景算子开发诉求。 项目地址: https://gitcode.com/ca…...

CANN/Ascend C调试工具集

Ascend C Tools 【免费下载链接】asc-tools Ascend C Tools仓是CANN基于Ascend C编程语言推出的配套调试工具仓。 项目地址: https://gitcode.com/cann/asc-tools 🚀概述 Ascend C Tools是CANN编程语言推出的配套调试工具。借助Ascend C Tools,开…...

无代码AI平台实战:从业务需求到模型部署的完整指南

1. 项目概述:当AI不再是程序员的专属玩具 “AI民主化”这个词最近听得耳朵都快起茧了,但真正落到实处的体验是什么?作为一个在技术和业务之间反复横跳了十多年的老手,我亲眼见证了从“只有博士才能玩转的算法黑箱”到“业务经理自…...

卷积运算:从数学原理到信号处理实战

1. 卷积基础与核心概念在数字信号处理领域,卷积运算堪称"瑞士军刀"般的存在。我第一次接触这个概念是在研究生时期的语音信号处理课上,当时教授用了一个生动的比喻:卷积就像把一杯墨水倒入一盆清水中,观察墨水如何随时间…...

动力锂离子电池SOC与热失控关键参数建模计算【附模型】

✨ 本团队擅长数据搜集与处理、建模仿真、程序设计、仿真代码、EI、SCI写作与指导,毕业论文、期刊论文经验交流。 ✅ 专业定制毕设、代码 ✅ 如需沟通交流,点击《获取方式》 (1)基于RA-TLBO算法的电化学模型参数高效辨识&#xf…...

LNG船双燃料发电机组经济负荷分配与协调控制【附程序】

✨ 本团队擅长数据搜集与处理、建模仿真、程序设计、仿真代码、EI、SCI写作与指导,毕业论文、期刊论文经验交流。 ✅ 专业定制毕设、代码 ✅ 如需沟通交流,点击《获取方式》 (1)基于改进遗传算法的双燃料发动机燃料优化分配&…...

Codex宠物模式上线后,程序员们开始了疯狂整活...(附使用教程)

Codex宠物模式上线后,程序员们开始了疯狂整活… 关键词:Codex宠物模式、petdex宠物网站、Codex自定义宠物、ikun-hoops、Codex pets安装教程 前几天我在更新 Codex 的时候,发现它悄悄上线了一个「宠物模式」。 一开始我以为只是那种简单的桌…...

Codex API登录切换导致会话丢失的解决方案(含工具实践)

Codex API登录切换导致会话丢失的解决方案(含工具实践) 关键词 Codex Desktop API登录、Codex会话丢失、Codex线程不见了、Codex Session Toolkit、ai-cli-kit、会话迁移工具、Codex账号切换、Claude Clean工具、AI CLI工具箱 codex客户端下载地址:htt…...

英雄联盟段位伪装终极指南:3分钟掌握LeaguePrank使用技巧

英雄联盟段位伪装终极指南:3分钟掌握LeaguePrank使用技巧 【免费下载链接】LeaguePrank 项目地址: https://gitcode.com/gh_mirrors/le/LeaguePrank 还在为英雄联盟好友列表上的段位显示而烦恼吗?想要在游戏中展示不一样的自己却不知道如何操作&…...

英雄联盟智能助手Seraphine:如何用5分钟提升你的游戏体验?

英雄联盟智能助手Seraphine:如何用5分钟提升你的游戏体验? 【免费下载链接】Seraphine 英雄联盟战绩查询工具 项目地址: https://gitcode.com/gh_mirrors/se/Seraphine 还在为BP阶段手忙脚乱而烦恼吗?还在手动查询队友对手战绩浪费宝贵…...

百度网盘下载限速终结者:3分钟掌握免费高速下载终极方案

百度网盘下载限速终结者:3分钟掌握免费高速下载终极方案 【免费下载链接】baidu-wangpan-parse 获取百度网盘分享文件的下载地址 项目地址: https://gitcode.com/gh_mirrors/ba/baidu-wangpan-parse 还在为百度网盘那令人抓狂的下载速度而烦恼吗?…...

5分钟深度解锁:ncmdump智能音频转换方案完全指南

5分钟深度解锁:ncmdump智能音频转换方案完全指南 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 你是否曾为下载的网易云音乐NCM格式文件无法在其他设备播放而烦恼?音频格式转换工具ncmdump为你提供了一套完整…...