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

【docker】多阶段构建与基础构建,及企业案例展示

基础构建与多阶段构建对比

基础构建(单阶段构建)

在基础构建中,所有构建过程和最终的应用程序都在同一个镜像中进行,构建工具和最终应用程序都会在最终镜像中。
这样构建镜像时会包含所有的构建工具和依赖,因此最终镜像可能会非常大。

示例:

FROM golang:1.18WORKDIR /app# 复制源代码
COPY . .# 获取依赖并编译 Go 应用
RUN go mod tidy && go build -o myapp .# 暴露应用端口
EXPOSE 8080# 启动应用
CMD ["./myapp"]

缺点

  • 最终镜像包含构建工具和依赖,导致镜像体积较大。
  • 构建工具和中间文件也被打包在镜像中,增加了潜在的安全风险。

多阶段构建

多阶段构建将构建过程分为多个阶段。构建阶段和运行阶段使用不同的镜像,最终只将构建好的应用和最小的运行时镜像打包到最终镜像中。

示例:

# 第一阶段:编译阶段
FROM golang:1.18 AS builderWORKDIR /app# 复制源代码
COPY . .# 获取依赖并编译 Go 应用
RUN go mod tidy && go build -o myapp .# 第二阶段:运行阶段
FROM alpine:latestWORKDIR /root/# 从第一阶段复制编译好的二进制文件
COPY --from=builder /app/myapp .# 暴露应用端口
EXPOSE 8080# 启动应用
CMD ["./myapp"]

优点

  • 最终镜像只有运行时需要的内容,避免了构建工具和临时文件。
  • 可以选择更小、更安全的镜像(如 alpine),大大减小了镜像体积。
  • 多阶段构建提高了镜像的安全性,因为编译工具仅用于构建阶段,运行时环境不需要这些工具。

基础构建与多阶段构建对比表格

特性基础构建多阶段构建
镜像大小较大,包含构建工具和中间文件较小,仅包含编译后的二进制文件和最小运行环境
构建工具构建工具(如编译器)与运行时文件一起打包到最终镜像中构建工具仅存在于构建阶段,最终镜像不包含它们
安全性安全性较低,因为镜像包含了编译工具和其他不必要的内容更安全,因为只包含运行应用所需的最小环境
构建速度较慢,因为构建工具和源文件都要复制到最终镜像中,可能导致镜像冗余更快,构建工具和源文件被分离,只将必要内容复制到最终镜像
适用场景小型项目或者简单的应用构建,无需考虑镜像体积和安全性复杂应用,特别是需要减小镜像体积、提高安全性的情况
复杂性较简单,只需一个镜像需要多个阶段和 COPY --from 指令,构建过程稍复杂

总结

  • 基础构建:适用于简单应用,镜像较大,包含了不必要的构建工具和依赖。
  • 多阶段构建:通过分阶段构建,最终镜像更小,安全性更高,适合生产环境。
  • 多阶段构建 在生产环境中更常见,能够有效优化镜像体积,提高安全性。

多阶段构建在企业级应用中的常见案例

1. Go 应用构建和部署

在企业级 Go 应用中,通常需要先构建应用,再将其部署到一个更小、更安全的基础镜像中。这种做法减少了不必要的构建依赖,提高了镜像的安全性和运行效率。

示例:

# 第一阶段:构建 Go 应用
FROM golang:1.18 AS builderWORKDIR /app# 复制源代码和依赖
COPY . .# 获取依赖并编译 Go 应用
RUN go mod tidy && go build -o myapp .# 第二阶段:运行 Go 应用
FROM alpine:latestWORKDIR /app# 从构建阶段复制编译好的二进制文件
COPY --from=builder /app/myapp .EXPOSE 8080# 启动应用
CMD ["./myapp"]

该案例通过分阶段构建,首先使用 golang 镜像进行编译,然后将编译好的二进制文件复制到更小的 alpine 镜像中,减小了最终镜像的体积,去除了构建工具。

2. Node.js + React 前端应用构建和部署

对于使用 Node.js 构建的前端应用,开发人员通常会先构建应用的生产版本,然后将其部署到一个最小化的静态文件服务器中。例如,使用 nginx 作为静态资源的服务器。

示例:

# 第一阶段:构建 React 前端应用
FROM node:16 AS builderWORKDIR /app# 复制源代码
COPY . .# 安装依赖并构建前端应用
RUN npm install && npm run build# 第二阶段:使用 Nginx 作为静态文件服务器
FROM nginx:alpine# 将 React 构建的静态文件复制到 Nginx 中
COPY --from=builder /app/build /usr/share/nginx/htmlEXPOSE 80CMD ["nginx", "-g", "daemon off;"]

该示例首先使用 Node.js 镜像来安装依赖并构建 React 应用,然后将构建好的静态文件复制到更轻量的 nginx 镜像中用于生产部署。这样可以大大减小镜像体积,且避免了将开发依赖暴露在生产环境中。

3. Java Spring Boot 应用构建和部署

对于 Java 后端应用,企业级的开发常常使用 Spring Boot 等框架。多阶段构建可以将构建过程和生产环境分开,最终镜像中只包含应用程序及其运行时依赖,而不包含构建工具或开发依赖。

示例:

# 第一阶段:构建阶段
FROM maven:3.8.4-openjdk-17 AS builderWORKDIR /app# 复制项目文件并构建应用
COPY pom.xml .
COPY src ./src
RUN mvn clean install# 第二阶段:运行阶段
FROM openjdk:17-alpineWORKDIR /app# 从构建阶段复制 Jar 包
COPY --from=builder /app/target/myapp.jar /app/EXPOSE 8080CMD ["java", "-jar", "myapp.jar"]

这个示例中,我们首先在 maven 镜像中进行构建,然后将构建出来的 Jar 包复制到更小的 openjdk 镜像中进行生产环境部署。最终镜像只包含运行所需的 Java 环境和应用,而没有 Maven 等构建工具。

4. Python Flask 应用构建和部署

Python 应用(如 Flask 框架)通常需要一个构建阶段来安装依赖并准备应用。多阶段构建在这种情况下同样可以有效减小镜像体积。

示例:

# 第一阶段:构建 Python 环境
FROM python:3.9-slim AS builderWORKDIR /app# 复制源代码
COPY . .# 安装依赖
RUN pip install --no-cache-dir -r requirements.txt# 第二阶段:运行 Python 应用
FROM python:3.9-slimWORKDIR /app# 从构建阶段复制安装好的依赖
COPY --from=builder /app /appEXPOSE 5000CMD ["python", "app.py"]

在这个示例中,构建阶段将安装所有 Python 依赖并准备应用。然后,将最终应用和依赖复制到更小的基础镜像中,从而减小镜像体积。

总结

在企业级应用中,多阶段构建非常适合于以下情况:

  • 需要将构建过程和运行时环境分离,避免将开发工具和中间文件暴露在生产环境中。
  • 需要优化镜像体积,减少不必要的构建依赖。
  • 需要将构建工具(如 Maven、Node.js、Go 等)与运行时环境(如 JDK、Nginx、Alpine 等)分开,确保最终镜像的安全性和精简性。

通过这些常见案例,企业可以实现更高效、精简、安全的 Docker 镜像构建与部署过程。

相关文章:

【docker】多阶段构建与基础构建,及企业案例展示

基础构建与多阶段构建对比 基础构建(单阶段构建) 在基础构建中,所有构建过程和最终的应用程序都在同一个镜像中进行,构建工具和最终应用程序都会在最终镜像中。 这样构建镜像时会包含所有的构建工具和依赖,因此最终镜…...

基于链表的基础笔试/面试题

1. 反转链表 问题描述:反转一个单向链表。 示例: 输入:1 → 2 → 3 → 4 → 5 输出:5 → 4 → 3 → 2 → 1 class ListNode {int val;ListNode next;ListNode(int x) {val x;} }public class LinkedList {public ListNode …...

SARIMA 模型Matlab代码

% 导入数据 data readtable(data.xlsx); % 假设数据在第一列 y data{:, 1}; % 获取第一列数据% 划分训练集和测试集,80% 训练,20% 测试 trainSize floor(0.8 * length(y)); trainData y(1:trainSize); testData y(trainSize1:end);% 创建时间序列…...

第八课 Unity编辑器创建的资源优化_特效篇(Particle System)详解

无论是CPU还是GPU,粒子系统对其的影响面都是不容小觑的。随着项目的重度化和3A化,玩家的口味变挑剔了、游戏玩法复杂度变高了、画面的特效表现变复杂了......所以我们还是更加谨慎地对待粒子系统。 特效(Particle System) 游戏效…...

Oracle对比表与表之间的结构

自己首先想到的就是,navicat有提供结构同步 但是有些时候情况不一样,比如我遇到的是连接不同,而且是互相同步,以最多的列的那个表为样 没有说一个固定的源 那么还可以通过导出表结构去另一个库中执行看是否报错,以此来判断结构的不同 但是我感觉有点儿麻烦 最后想到通过sql语…...

基于JSP+MySQL的网上招聘系统的设计与实现

摘要 在这样一个经济飞速发展的时代,人们的生存与生活问题已成为当代社会需要关注的一个焦点。对于一个刚刚 踏入社会的年轻人来说,他对就业市场和形势了解的不够详细,同时对自己的职业规划也很模糊,这就导致大量的 时间被花费在…...

【Linux】进程地址空间(虚拟地址vs物理地址vs页表)

Linux 进程概念补充【Linux】 进程是什么(不熟悉的兄弟可以看看)。 1. C/C内存分布图 对于有c/c基础的同学相信对上面的图片并不陌生,实际上其描述的并不是正真的物理内存,而是虚拟内存,我们把它叫做进程地址空间 。 2…...

pytorch 融合 fuse 学习笔记

目录 fuse_lora 作用是什么 fuse_modules源码解读 fuse_lora 作用是什么 在深度学习模型微调场景下(与 LoRA 相关) 参数融合功能 在使用 LoRA(Low - Rank Adaptation)对预训练模型进行微调后,fuse_lora函数的主要作…...

在 Ubuntu 20.04 上使用 Lux 下载 Bilibili 视频的详细教程

在 Ubuntu 20.04 上使用 Lux 下载 Bilibili 视频的详细教程 在 Ubuntu 20.04 上使用 Lux 下载 Bilibili(哔哩哔哩)视频的完整和详细步骤如下,包括使用预编译二进制文件的安装方法: 1. 安装依赖 确保你的系统已安装 FFmpeg&…...

【eclipse】快捷键

【eclipse】快捷键 编辑导航重构调试复制其他快速生成 Eclipse 提供了丰富的快捷键来帮助开发者提高工作效率。 以下是一些常用的 Eclipse 快捷键,它们覆盖了编辑、导航、重构、调试等多个方面。 这些快捷键能够显著提升开发效率,尤其是在处理大型项目时…...

集成开发环境(IDE)的使用技巧插件配置

在开发过程中,集成开发环境(IDE)的使用技巧和插件配置对提高工作效率、优化代码质量和加速调试至关重要。 一、IDE使用技巧 1. 代码导航 跳转到定义(Go to Definition):快速跳转到函数、类或变量的定义位…...

【如何提升代码工程质量】code review篇

应该对于基本上所有软件相关的公司来说,都有committer机制,即代码写好之后会提交合并请求,待相关人员code review通过后再进行合入,所以code review就是代码合入代码仓库的最后一道关卡,对于代码质量的影响也是不容忽视…...

Qt 面试题学习13_2024-12-1

Qt 面试题 1、 QString与基本数据类型如何转换?2、常用数据结构3、进程之间的道信方式有哪些? 1、 QString与基本数据类型如何转换? 1、将QString转换为基本数据类型通过QString的各种转换函数,可以将QString转换为int、float、double等基本数据类型。 QStri…...

Hive 安装与架构详解

Hive 安装(基于 Ubuntu 系统) 为了学习 Hive 的相关操作,我们需要先安装 Hive,以下是基于 Ubuntu 系统安装 Hive 的步骤: 下载 Hive 我们将使用 hive-0.13.1-cdh5.3.2 版本,当然你可以根据需要下载最新的…...

前端入门指南:模块打包器是什么?模块打包器的工作原理与实践

前言 在前端开发的生态系统中,随着项目复杂度和规模的不断提升,代码管理和优化变得至关重要。模块化开发作为一种有效的代码组织方式,极大地提升了代码的可维护性和复用性。 然而,面对大量的模块和复杂的依赖关系,如…...

初识ProtoBuf以及环境搭建(Win和Ubuntu)

初始ProtoBuf 序列化和反序列化的概念 序列化:把对象转换为字节序列的过程 称为对象的序列化。 反序列化:把字节序列恢复为对象的过程 称为对象的反序列化。 什么情况下需要序列化和反序列化? 存储数据:当你想把的内存中的对象状…...

springboot366高校物品捐赠管理系统(论文+源码)_kaic

毕 业 设 计(论 文) 高校物品捐赠管理系统设计与实现 摘 要 传统办法管理信息首先需要花费的时间比较多,其次数据出错率比较高,而且对错误的数据进行更改也比较困难,最后,检索数据费事费力。因此&#xff…...

【Python网络爬虫笔记】5-(Request 带参数的get请求) 爬取豆瓣电影排行信息

目录 1.抓包工具查看网站信息2.代码实现3.运行结果 1.抓包工具查看网站信息 请求路径 url:https://movie.douban.com/typerank请求参数 页面往下拉,出现新的请求结果,参数start更新,每次刷新出20条新的电影数据 2.代码实现 # 使用网络爬…...

递归算法讲解(c基础)

递归的定义 递归是指在函数的定义中使用函数自身的方法。它是一种解决问题的策略,将一个大型复杂的问题逐步分解为规模更小的、与原问题相似的子问题来解决。当子问题的规模足够小,达到一个可以直接求解的基本情况(也称为终止条件&#xff09…...

AJAX一、axios使用,url组成(协议,域名,资源路径)查询参数和化简,错误处理,请求/响应报文,状态码,接口文档,

一、AJAX是什么 概念 &#xff1a; AJAX是一种与服务器&#xff08;后端&#xff09;通信的技术 二、请求库axios的基本用法 1导包 2使用 // 1. 发请求 axios({ url: 请求地址 }).then(res > { // 2.接收并使用数据 }) <body><p class"province"…...

树莓派超全系列教程文档--(61)树莓派摄像头高级使用方法

树莓派摄像头高级使用方法 配置通过调谐文件来调整相机行为 使用多个摄像头安装 libcam 和 rpicam-apps依赖关系开发包 文章来源&#xff1a; http://raspberry.dns8844.cn/documentation 原文网址 配置 大多数用例自动工作&#xff0c;无需更改相机配置。但是&#xff0c;一…...

对WWDC 2025 Keynote 内容的预测

借助我们以往对苹果公司发展路径的深入研究经验&#xff0c;以及大语言模型的分析能力&#xff0c;我们系统梳理了多年来苹果 WWDC 主题演讲的规律。在 WWDC 2025 即将揭幕之际&#xff0c;我们让 ChatGPT 对今年的 Keynote 内容进行了一个初步预测&#xff0c;聊作存档。等到明…...

使用van-uploader 的UI组件,结合vue2如何实现图片上传组件的封装

以下是基于 vant-ui&#xff08;适配 Vue2 版本 &#xff09;实现截图中照片上传预览、删除功能&#xff0c;并封装成可复用组件的完整代码&#xff0c;包含样式和逻辑实现&#xff0c;可直接在 Vue2 项目中使用&#xff1a; 1. 封装的图片上传组件 ImageUploader.vue <te…...

第25节 Node.js 断言测试

Node.js的assert模块主要用于编写程序的单元测试时使用&#xff0c;通过断言可以提早发现和排查出错误。 稳定性: 5 - 锁定 这个模块可用于应用的单元测试&#xff0c;通过 require(assert) 可以使用这个模块。 assert.fail(actual, expected, message, operator) 使用参数…...

【Web 进阶篇】优雅的接口设计:统一响应、全局异常处理与参数校验

系列回顾&#xff1a; 在上一篇中&#xff0c;我们成功地为应用集成了数据库&#xff0c;并使用 Spring Data JPA 实现了基本的 CRUD API。我们的应用现在能“记忆”数据了&#xff01;但是&#xff0c;如果你仔细审视那些 API&#xff0c;会发现它们还很“粗糙”&#xff1a;有…...

04-初识css

一、css样式引入 1.1.内部样式 <div style"width: 100px;"></div>1.2.外部样式 1.2.1.外部样式1 <style>.aa {width: 100px;} </style> <div class"aa"></div>1.2.2.外部样式2 <!-- rel内表面引入的是style样…...

零基础设计模式——行为型模式 - 责任链模式

第四部分&#xff1a;行为型模式 - 责任链模式 (Chain of Responsibility Pattern) 欢迎来到行为型模式的学习&#xff01;行为型模式关注对象之间的职责分配、算法封装和对象间的交互。我们将学习的第一个行为型模式是责任链模式。 核心思想&#xff1a;使多个对象都有机会处…...

HarmonyOS运动开发:如何用mpchart绘制运动配速图表

##鸿蒙核心技术##运动开发##Sensor Service Kit&#xff08;传感器服务&#xff09;# 前言 在运动类应用中&#xff0c;运动数据的可视化是提升用户体验的重要环节。通过直观的图表展示运动过程中的关键数据&#xff0c;如配速、距离、卡路里消耗等&#xff0c;用户可以更清晰…...

人机融合智能 | “人智交互”跨学科新领域

本文系统地提出基于“以人为中心AI(HCAI)”理念的人-人工智能交互(人智交互)这一跨学科新领域及框架,定义人智交互领域的理念、基本理论和关键问题、方法、开发流程和参与团队等,阐述提出人智交互新领域的意义。然后,提出人智交互研究的三种新范式取向以及它们的意义。最后,总结…...

基于IDIG-GAN的小样本电机轴承故障诊断

目录 🔍 核心问题 一、IDIG-GAN模型原理 1. 整体架构 2. 核心创新点 (1) ​梯度归一化(Gradient Normalization)​​ (2) ​判别器梯度间隙正则化(Discriminator Gradient Gap Regularization)​​ (3) ​自注意力机制(Self-Attention)​​ 3. 完整损失函数 二…...