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

Dockerfile 编写经验:优化大小与效率

文章目录

    • Dockerfile 通用的技巧总结
      • 1. 使用多阶段构建
      • 2. 最小化层数
      • 3. 彻底清理
      • 4. 选择合适的基镜像
      • 5. 仅安装必要的依赖
      • 6. 利用构建缓存
    • 常见陷阱
    • 总结

Dockerfile 通用的技巧总结

1. 使用多阶段构建

  • 利用多阶段构建分离构建和运行时环境,仅将必要的产物(二进制文件、库、配置)复制到最终阶段,这通过排除构建工具和中间文件保持运行时镜像精简

  • 示例:仅从构建阶段复制编译后的二进制文件和特定资源

    WORKDIR /device-openvino
    # Copy binaries and resources from the builder stage
    COPY --from=builder /device-openvino/device-openvino-object-classification-c /device-openvino/device-openvino-object-classification-c
    # Copy the CSDK library (custom dependency built by build_deps.sh)
    COPY --from=builder /opt/iotech/iot/1.5/lib /opt/iotech/iot/1.5/lib
    COPY --from=builder /device-openvino/deps/device-sdk-c/build/release/_CPack_Packages/Linux/TGZ/csdk-0.0.0 /device-openvino/csdk
    # copy device service configuration file
    COPY res/configuration.yaml /device-openvino/res/configuration.yaml
    COPY res/profiles /device-openvino/res/profiles
    COPY res/devices /device-openvino/res/devices
    

2. 最小化层数

  • 将相关命令(例如,apt-get update && apt-get install )合并到单个 RUN 指令中,以减少层数。每个 RUN 都会创建一个新层,增加镜像大小。

  • 使用&&\保持可读性,同时串联命令。

    # Configure the image source and install runtime dependencies
    RUN sed -i 's/archive.ubuntu.com/mirror.nju.edu.cn/g' /etc/apt/sources.list && \sed -i 's/security.ubuntu.com/mirror.nju.edu.cn/g' /etc/apt/sources.list && \apt-get update && apt-get install -y curl gnupg && \# Configure OpenVINO repositorycurl -fsSL https://apt.repos.intel.com/intel-gpg-keys/GPG-PUB-KEY-INTEL-SW-PRODUCTS.PUB | apt-key add - && \echo "deb https://apt.repos.intel.com/openvino/2025 ubuntu22 main" | tee /etc/apt/sources.list.d/intel-openvino-2025.list && \# Configure Intel GPU repositorycurl -fsSL https://repositories.intel.com/gpu/intel-graphics.key | \gpg --yes --dearmor --output /usr/share/keyrings/intel-graphics.gpg && \echo "deb [arch=amd64,i386 signed-by=/usr/share/keyrings/intel-graphics.gpg] https://repositories.intel.com/gpu/ubuntu jammy unified" | \tee /etc/apt/sources.list.d/intel-gpu-jammy.list && \# Install runtime dependenciesapt-get update && apt-get install -y \# base dependenciesdumb-init \libyaml-dev \uuid-dev \libpaho-mqtt-dev \libcbor-dev \
    ...
    

3. 彻底清理

  • 在包安装后始终移除临时文件,例如APT缓存(/var/lib/apt/lists/*)。使用apt-get clean--no-install-recommends避免不必要的依赖。

  • 示例:

        # cleanup--no-install-recommends && \apt-get clean && \rm -rf /var/lib/apt/lists/*
    

4. 选择合适的基镜像

  • 选择满足需求的最小基镜像(例如,ubuntu:22.04 或更小的 debian:slim )。除非必要,避免使用臃肿的镜像。

  • 明确指定平台(例如,--platform=linux/amd64 )以确保兼容性

    # including its dependencies
    ARG BASE=ubuntu:22.04
    FROM --platform=linux/amd64 ${BASE} as builder
    LABEL license='SPDX-License-Identifier: Apache-2.0' \
    ...
    

5. 仅安装必要的依赖

  • 精确指定运行时依赖。避免在最终镜像中安装开发包(例如,libopencv-dev),除非必要。新版Dockerfile选择性安装OpenCV模块是一个很好的示例。
  • 使用apt-cache search或包文档确定确切的依赖。

6. 利用构建缓存

  • 按从最不可能更改到最可能更改的顺序排列指令(例如,先安装包,再复制源代码)。这最大化构建缓存的复用。

  • 新版Dockerfile在 make 之前复制源代码,确保早期层(例如依赖安装)被缓存,能大大节省构建时间!

    # build device service 
    COPY src /device-openvino/src
    COPY Makefile /device-openvino/Makefile
    RUN make clean build# Stage 2: Create the final runtime image
    FROM --platform=linux/amd64 ${BASE}
    

常见陷阱

  • 过度安装依赖:在运行时镜像中安装广泛的包(例如,libopencv-dev)会增加体积。始终验证运行时需求。
  • 忘记清理:不移除APT缓存或临时文件会在镜像中留下不必要的数据。
  • 冗余指令:重复环境变量设置或存储库配置会增加层数和复杂性。
  • 未固定版本:不指定包版本可能导致构建不一致。
  • 广泛的COPY命令:不加筛选地复制整个目录会包含未使用的文件,增加大小。

总结

本文展示了如何通过合并命令、清理缓存和选择最小依赖等小而精心的更改,显著减少 Dockerfile 构建镜像的大小、开发过程的效率以及发布后的稳定性。通过遵循上述技巧,可以创建精简、安全且高效的Docker镜像,使应用更易于部署和维护。

相关文章:

Dockerfile 编写经验:优化大小与效率

文章目录 Dockerfile 通用的技巧总结1. 使用多阶段构建2. 最小化层数3. 彻底清理4. 选择合适的基镜像5. 仅安装必要的依赖6. 利用构建缓存 常见陷阱总结 Dockerfile 通用的技巧总结 1. 使用多阶段构建 利用多阶段构建分离构建和运行时环境,仅将必要的产物&#xff…...

JMeter 是什么

JMeter 是一款由 Apache 基金会开发的 开源性能测试工具,主要用于对 Web 应用、API、数据库、消息队列等系统进行 压力测试、负载测试和功能测试。它通过模拟大量用户并发操作,帮助开发者评估系统的性能、稳定性和扩展能力。以下是其核心特性和使用详解&…...

压测服务器和线上环境的区别

在进行服务器压测时,测试环境与线上环境的差异会直接影响测试结果的可靠性。以下是两者的关键区别及注意事项: ​1. 压测服务器的常见类型​ ​本地开发机​:低配虚拟机(如4核8GB),仅用于功能验证&#xf…...

C#、C++、Java、Python 选择哪个好

选择哪种语言取决于具体需求:若关注性能和底层控制选C、若开发企业级应用选Java、若偏好快速开发和丰富生态选Python、若构建Windows生态应用选C#。 以Python为例,它因语法简洁、开发效率高、应用广泛而在AI、数据分析、Web开发等领域大放异彩。根据TIOB…...

OpenGL Chan视频学习-8 How I Deal with Shaders in OpenGL

bilibili视频链接: 【最好的OpenGL教程之一】https://www.bilibili.com/video/BV1MJ411u7Bc?p5&vd_source44b77bde056381262ee55e448b9b1973 函数网站: docs.gl 说明: 1.之后就不再整理具体函数了,网站直接翻译会更直观也…...

机器学习课程设计报告 —— 基于口红数据集的情感分析

目录 一、课程设计目的 二、数据预处理及分析 2.1 数据预处理 2.2 数据分析 三、特征选择 3.1 特征选择的重要性 3.2 如何进行特征选择 3.3 特征选择的依据 3.4 数据集的划分 四、模型训练与模型评估 4.1 所有算法模型不调参 4.2 K-近邻分类模型 4.3 GaussianNB模…...

Windows安装Docker部署dify,接入阿里云api-key进行rag测试

一、安装docker 1.1 傻瓜式安装docker Get Docker | Docker Docs Docker原理(图解秒懂史上最全)-CSDN博客 官网选择好windows的安装包下载,傻瓜式安装。如果出现下面的报错,说明主机没有安装WSL 1.2 解决办法 安装 WSL | Mic…...

Dify中 SYSTEM, USER, ASSISTANT 的关系、职责与使用方法

在Dify这类对话式AI应用构建平台中,SYSTEM, USER, ASSISTANT 这三种消息类型共同定义了与大型语言模型(LLM)交互的结构和上下文。它们的关系可以理解为: SYSTEM: 扮演着“导演”或“场景设定者”的角色。USER: 扮演着“提问者”或“任务发起者”的角色。ASSISTANT: 扮演着“…...

斗地主游戏出牌逻辑用Python如何实现

在Python中实现斗地主的出牌逻辑需要结合游戏规则与数据结构设计,以下是核心实现思路和代码示例: 一、基础数据结构设计 1. 扑克牌表示 用类或字典表示每张牌的花色和点数,例如: class Card: def __init__(self, suit, rank): sel…...

ST-GCN

1.bash 安装git 在目录下右键使用git bash打开 需要安装wgetbash download_model.sh,下载.sh文件 wget: command not found,Windows系统使用git命令 下载预训练权重_sh文件下载-CSDN博客 bash tools/get_models.sh 生成了三个.pt文件...

【ArcGIS Pro草履虫大师】空间地图系列

地图系列是根据单个布局来构建的页面集合。 正常情况下,一个布局只能导出一个页面,通过地图系列则可以通过不同的视图、动态元素,构建并导出多个页面。 地图系列发展自ArcMap的【数据驱动页面】功能。 ArcGIS Pro中有3个地图系列&#xff…...

1. 数据结构基本概念 (1)

本文部分ppt、视频截图来自:[青岛大学-王卓老师的个人空间-王卓老师个人主页-哔哩哔哩视频] 1. 数据结构基本概念 1.1 研究内容 数据结构是一门研究非数值计算的程序设计中计算机操作队形以及他们之间关系和操作的核心课程,学习的主要内容如下&#x…...

海思3519V200 上基于 Qt 的 OpenCV 和 MySql 配置开发

海思3519V200是一款高性能嵌入式处理器,广泛应用于智能安防、工业控制等领域。本文将详细介绍如何在海思3519V200 平台上基于 Qt 配置 OpenCV 和 MySql,以满足嵌入式开发中的多样需求。 一、开发环境搭建 (一)硬件环境 准备海思3519V200开发板一台,并确保其能够正常启动…...

php 设计模式详解

简介 PHP 设计模式是对软件开发中常见问题的可复用解决方案,通过标准化的结构提升代码的可维护性、扩展性和复用性。 创建型模式(对象创建) 关注对象的创建过程,解决 “如何灵活、安全地生成对象” 的问题。 单例模式&#xf…...

函数抓取图片microsoft excel与wps的区别

microsoft excel 写出index函数 找到图片所在的位置 INDEX(员工数据库!$H:$H,MATCH(Sheet1!$B$3,员工数据库!$A:$A,0))将index函数定义为名称 插入截图 插入-屏幕截图-屏幕剪辑 选中给截图插入定义的公式 WPS 直接写公式抓取...

openpi π₀ 项目部署运行逻辑(三)——策略推理服务器 serve_policy.py

π₀ 主控脚本都在 scripts 中: 其中,serve_policy.py 是 openpi 中的策略推理服务端脚本,作用为:启动一个 WebSocket 服务器,加载预训练策略模型,等待外部请求(如来自 main.py 的控制程序&…...

WEB3—— 简易NFT铸造平台(ERC-721)-入门项目推荐

3. 简易NFT铸造平台(ERC-721) 目标:用户可以免费铸造一个 NFT,展示在前端页面。 内容: 编写 ERC-721 合约,每个地址可铸造一个 NFT。 提供 API: POST /mint:铸造 NFT(调…...

基于vue框架的独居老人上门护理小程序的设计r322q(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。

系统程序文件列表 项目功能:用户,护理人员,服务预约,服务评价,服务类别,护理项目,请假记录 开题报告内容 基于Vue框架的独居老人上门护理小程序的设计开题报告 一、研究背景与意义 (一)研究背景 随着社会老龄化的加剧,独居老…...

Android 15 控制亮屏灭屏接口实现

Android 15 控制亮屏灭屏接口实现 在 Android 系统开发中,控制设备的亮屏和灭屏是一个常见需求,尤其是在一些特定场景下,如智能家居控制、定时任务等。本文将详细介绍如何在 Android 15 中实现系统级别的亮屏和灭屏控制。 系统修改方案 为了实现更可靠的亮屏和灭屏控制,…...

【前端】Hexo一键生成目录插件推荐_放入Hexo博客

效果 使用 安装 npm install hexo-auto-toc插件会自动对<article>包含下的所有内容进行解析&#xff0c;自动生成目录。如果你的文章页面结构中内容没被<article>包裹&#xff0c;需要自行添加它&#xff08;即blog文件夹下的index.html&#xff09;查看效果 hex…...

每日一题——提取服务器物料型号并统计出现次数

提取服务器物料型号并统计出现次数 一、题目描述&#x1f4a1; 输入描述&#xff1a;&#x1f4e4; 输出描述&#xff1a; 二、样例示例&#x1f3af; 示例1&#x1f3af; 示例2 三、解题思路1. 子串提取策略&#xff1a;正则匹配2. 统计策略&#xff1a;哈希映射3. 输出策略 四…...

宫格导航--纯血鸿蒙组件库AUI

摘要&#xff1a; 宫格导航(A_GirdNav)&#xff1a;可设置导航数据&#xff0c;建议导航项超过16个&#xff0c;可设置“更多”图标指向的页面路由。最多显示两行&#xff0c;手机每行最多显示4个图标&#xff0c;折叠屏每行最多6个图标&#xff0c;平板每行最多8个图标。多余图…...

RNN 循环神经网络:原理与应用

一、RNN 的诞生背景 传统神经网络&#xff08;如 MLP、CNN&#xff09;在处理独立输入时表现出色&#xff0c;但现实世界中存在大量具有时序依赖的序列数据&#xff1a; 自然语言&#xff1a;"我喜欢吃苹果" 中&#xff0c;"苹果" 的语义依赖于前文 "…...

React---day2

2、jsx核心语法 2.1 class 和java很像啊 <script>// 定义一个对象class Person {//构造函数constructor(name , age){this.name name;this.age age;}// 定义一个方法sayHello(){console.log(hello ${this.name});}}// 创建一个对象Person1 new Person(张三 , 18);//…...

若依框架 账户管理 用户分配界面解读

下载下来若依网站后 先对 后端代码进行解读 首先项目架构&#xff1a; 一般用 admin 这个比较多进行二次开发 其他 rouyi-common,rouyi-framework:为公共部分 rouyi-generator&#xff1a;代码生成部分 ruoyi-quartz&#xff1a;定时任务 ruoyi-system&#xff1a;系统任务 …...

文档贡献 | 技术文档贡献流程及注意事项(保姆级教程)

内容目录 一、注册流程 二、创建分支&#xff08;Fork&#xff09; 三、使用GitLab界面更新文件的MR流程 四、使用Git命令行工具更新文件的MR流程 五、注意事项 一、注册流程 1、注册页面 在长安链平台注册页面&#xff0c;输入手机号码 &#xff0c;点击 “获取验证码”…...

open-vscode-server +nodejs 安装

GitCode - 全球开发者的开源社区,开源代码托管平台GitCode是面向全球开发者的开源社区,包括原创博客,开源代码托管,代码协作,项目管理等。与开发者社区互动,提升您的研发效率和质量。https://gitcode.com/gh_mirrors/op/openvscode-server/?utm_sourceartical_gitcode&ind…...

知行之桥如何将消息推送到钉钉群?

在钉钉平台中&#xff0c;机器人主要分为企业机器人和自定义机器人两类。本文将重点介绍如何通过自定义机器人&#xff0c;实现将知行之桥 EDI 系统的通知消息高效推送至钉钉群&#xff0c;帮助企业第一时间掌握业务动态。 一、在钉钉群中添加自定义机器人 在需要接收知行之桥…...

09《从依赖管理到容器化部署:Maven 全链路实战笔记,解锁 Java 项目自动化构建的终极奥秘》

目录 一、Maven 核心基础强化 &#xff08;一&#xff09;Maven 架构与工作原理 1. 核心组件解析 2. 工作流程图示​编辑 &#xff08;二&#xff09;项目结构深度实践 1. 标准目录扩展说明 2. 多模块项目典型结构示例​编辑 二、依赖管理高级进阶 &#xff08;一&…...

<el-date-picker>组件传参时,选中时间和传参偏差8小时

遇到一个bug&#xff0c;不仔细看&#xff0c;都不一定能发现&#xff0c;bug描述&#xff1a;我们有一个搜索框&#xff0c;里面有一个时间选择器&#xff0c;当我使用<el-date-picker>时&#xff0c;我发现当我选择时分秒之后&#xff0c;显示都正常&#xff0c;但是当…...