Docker 分阶段构建

Docker 分阶段构建

Docker 分阶段构建(Multi-stage Build)是一种高效的镜像构建技术,允许在一个 Dockerfile 中使用多个构建阶段,每个阶段可以使用不同的基础镜像,最终只保留需要的文件,从而显著减小镜像体积。以下是分阶段构建的核心概念和示例:

为什么使用分阶段构建?

  1. 减小镜像体积:最终镜像只包含运行时所需的文件,不包含构建工具和临时文件。
  2. 简化 Dockerfile:无需手动清理中间文件,每个阶段专注于特定任务。
  3. 提高安全性:生产环境镜像不包含不必要的构建依赖,降低安全风险。

基本语法

使用 FROM <image> AS <stage-name> 定义多个构建阶段:

# 第一阶段:构建应用(使用较大的基础镜像)
FROM node:18 AS builder
WORKDIR /app
COPY package*.json ./
RUN npm install
COPY . .
RUN npm run build# 第二阶段:运行应用(使用轻量级基础镜像)
FROM node:18-slim
WORKDIR /app
COPY --from=builder /app/package*.json ./
COPY --from=builder /app/dist ./dist  # 只复制构建结果
RUN npm install --production  # 只安装生产依赖
CMD ["node", "dist/main.js"]

关键点说明

  1. 阶段命名:使用 AS <stage-name> 为每个阶段命名,便于后续引用。
  2. 文件复制:使用 COPY --from=<stage-name> 从之前的阶段复制文件。
  3. 基础镜像选择:构建阶段可使用完整的 SDK 镜像,运行阶段使用轻量级的运行时镜像(如 alpine 或 slim)。

常见场景示例

1. Go 应用分阶段构建
# 构建阶段
FROM golang:1.20 AS builder
WORKDIR /app
COPY . .
RUN go build -o myapp# 运行阶段
FROM alpine:3.18
WORKDIR /app
COPY --from=builder /app/myapp .
CMD ["./myapp"]
2. Java Spring Boot 应用分阶段构建
# 构建阶段
FROM maven:3.8.6-openjdk-11 AS builder
WORKDIR /app
COPY pom.xml .
RUN mvn dependency:go-offline
COPY src ./src
RUN mvn package -DskipTests# 运行阶段
FROM openjdk:11-jre-slim
WORKDIR /app
COPY --from=builder /app/target/myapp.jar .
CMD ["java", "-jar", "myapp.jar"]

高级技巧

  1. 多阶段复用:一个阶段可以从多个之前的阶段复制文件。
  2. 条件构建:使用 --target 参数指定构建到特定阶段(用于调试):
    docker build --target builder -t myapp:builder .
    
  3. 缓存优化:合理安排 COPY 指令顺序,利用 Docker 构建缓存。

注意事项

  • 每个 FROM 语句都会创建一个新阶段,之前阶段的环境不会延续。
  • 最终镜像体积只包含最后一个阶段的内容。
  • 分阶段构建不会影响构建速度,但能大幅减小镜像体积。

通过分阶段构建,你可以创建更高效、更安全的 Docker 镜像,同时保持开发流程的简洁性。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.pswp.cn/news/909413.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

人工智能学习23-BP-图像编码

人工智能学习概述—快手视频 人工智能学习23-BP-图像编码—快手视频

k8s的开篇学习和安装

k8s的开篇学习 学习网站 参考资料 1。 K8S能干什么 [概述 | Kubernetes](https://kubernetes.io/zh-cn/docs/concepts/overview/#why-you-need-kubernetes-and-what-can-it-do)需要开代理 2。docker资料 https://docs.docker.com/get-started/3.prometheus资料 https://promet…

CS144 lab0: warmup

Lab 0: networking warmup 1. 环境 依赖配置 sudo apt update && sudo apt install git cmake gdb build-essential clang \clang-tidy clang-format gcc-doc pkg-config glibc-doc tcpdump tsharkg13配置 ppa中科大源 # deb https://ppa.launchpadcontent.net/ubu…

StarRocks

StarRocks 是一个高性能的 分布式 MPP(Massively Parallel Processing)数据库,主要用于 实时数据分析(Real-Time Analytics),是新一代的 OLAP 数据库,对标 ClickHouse、Apache Doris 等。 🌟 一、StarRocks 是什么? StarRocks 是一个面向实时分析场景、支持高并发、高…

8088单板机8259中断的软件触发测试

1.工作原理 8086和8088的中断设计的是很巧妙的&#xff0c;比如给8259的IR1配置了一个中断&#xff0c;中断号为21H&#xff0c;那么当真个引脚出现高电平的时候&#xff0c;就会触发相应上的中断响应。但&#xff0c;这不是唯一能够触发21H中断的方法&#xff0c;还可以通过软…

TC3xx中PFLASH缓存对XCP标定常量的影响

1、TC3xx中PFLASH缓存&#xff08;Cache&#xff09;对XCP标定的影响 XCP的映射用到TC3XX的Overlay功能需要使用一段Pflash内存。 Pflash数据有两个段区。分别为0x80000000和0xA0000000为起始地址的PFLASH段。 如上&#xff0c;两段数据的区别是一个段8有CACHE缓存&#xff0c;…

代码审计服务:如何解决误报与漏报难题,保障软件安全?

代码审计服务在保障软件质量、安全合规等方面扮演着关键角色&#xff0c;特别是在数字化浪潮席卷而来的今天&#xff0c;其重要性日益显著。它能揭露代码中的不足&#xff0c;进而为软件开发提供有力的效率和安全性保障。 误报与漏报难题 常规的代码审查工具&#xff0c;其错…

web方向第一次考核内容

一.考核内容 Web组大一下考核之HTML、CSS 1.为什么要清除浮动&#xff08;4)&#xff0c;清除浮动的方法有哪些&#xff1f;(6)&#xff08;至少两种&#xff09; 2.怎么实现左边左边宽度固定右边宽度自适应的布局&#xff1f;(10) 3.讲讲flex:1;(10) 4.怎么实现移动端适配不同…

HarmonyOS 5 Cordova有哪些热门插件?

以下是 HarmonyOS 5 环境下 Cordova 的热门插件及核心代码实现&#xff08;综合实际开发场景高频使用&#xff09;&#xff1a; 一、核心工具类插件 1. ‌高性能图片压缩插件‌ ‌功能‌&#xff1a;直接调用鸿蒙 ImageSource API 实现硬件级加速压缩 ‌代码实现‌&#xff…

Cesium圆锥渐变色实现:融合顶点着色器、Canvas动态贴图与静态纹理的多方案整合

在Cesium中渲染圆锥体时&#xff0c;无论采用顶点着色器、Canvas动态贴图还是静态图片贴图&#xff0c;其渐变色均需满足以下条件&#xff1a; 圆形结构&#xff1a;渐变范围限定在圆锥底面的圆形区域内。径向扩散&#xff1a;颜色从圆心向外逐步变化&#xff08;如红→黄→蓝…

周末复习1

质量管理包括质量规划&#xff0c;质量保证&#xff0c;质量控制。质量管理体系要定期执行内部审核和管理评审。二者都属于质量保证过程。 实施质量保证的方法很多&#xff0c;过程分析属于实施质量保证的常用方法。 采购管理过程包括编制采购计划,实施采购,控制采购和结束采购…

英飞凌亮相SEMICON China 2025:以SiC、GaN技术引领低碳化与数字化未来

在刚刚落幕的SEMICON China 2025上&#xff0c;全球半导体行业再度汇聚上海&#xff0c;共同探讨产业未来。本届展会以“跨界全球•心芯相联”为主题&#xff0c;覆盖芯片设计、制造、封测、设备及材料等全产业链&#xff0c;充分展现了半导体技术的最新突破与创新趋势。 作为…

工业路由器赋能仓库消防预警,智慧消防物联网解决方案

在现代物流与仓储行业蓬勃发展的当下&#xff0c;仓库的规模与存储密度不断攀升&#xff0c;消防预警的重要性愈发凸显。传统消防系统在应对复杂仓库环境时&#xff0c;预警滞后、设备联动不畅、数据管理困难等弊端逐渐暴露。为了有效解决这些问题&#xff0c;工业路由器作为物…

【开发常用命令】:服务器与本地之间的数据传输

服务器与本地之间的数据传输 本地给服务器上传数据 scp /path/to/local_file usernameremotehost:/path/to/remote_directory例如 scp test.txt root192.168.1.xxx:/test # test.txt 需要上传到服务器的文件&#xff0c;如果非当前路径&#xff0c;使用文件的相对路径或绝对…

springboot + nacos + k8s 优雅停机

1 概念 优雅停机是什么&#xff1f;网上说的优雅下线、无损下线&#xff0c;都是一个意思。 优雅停机&#xff0c;通常是指在设备、系统或应用程序中止运作前&#xff0c;先执行一定的流程或动作&#xff0c;以确保数据的安全、预防错误并保证系统的整体稳定。 一般来说&…

Python 标准库之 math 模块

1. 前言 math 模块中包含了各种浮点运算函数&#xff0c;包括&#xff1a; 函数功能floor向下取整ceil向上取整pow指数运算fabs绝对值sqrt开平方modf拆分小数和整数fsum计算列表中所有元素的累加和copysign复制符号pi圆周率e自然对数 2. math.floor(n) 函数 math.floor(n) 的…

6.14星期六休息一天

Hey guys, Today’s Saturday, and I didn’t have to go to work, so I let myself sleep in a bit — didn’t get up until 8 a.m. My cousin invited me over to his place. He lives in a nearby city, about 80 kilometers away. But honestly, after a long week, I …

event.target 详解:理解事件目标对象

event.target 详解&#xff1a;理解事件目标对象 在 JavaScript 事件处理中&#xff0c;event.target 是一个关键属性&#xff0c;它表示最初触发事件的 DOM 元素。下面我将通过一个可视化示例详细解释其工作原理和使用场景。 <!DOCTYPE html> <html lang"zh-C…

Flutter 小技巧之:实现 iOS 26 的 “液态玻璃”

随着 iOS 26 发布&#xff0c;「液态玻璃」无疑是热度最高的标签&#xff0c;不仅仅是因为设计风格大变&#xff0c;更是因为 iOS 26 beta1 的各种 bug 带来的毛坯感让 iOS 26 冲上热搜&#xff0c;比如通知中心和控制中心看起来就像是一个半成品&#xff1a; 当然&#xff0c;…

Android工程中FTP加密传输与非加密传输的深度解析

详细的FTP传输实现方案&#xff0c;包括完整代码、安全实践、性能优化和实际应用场景分析。 一、FTP传输类型对比表&#xff08;增强版&#xff09; 特性非加密FTPFTPS (FTP over SSL/TLS)SFTP (SSH File Transfer Protocol)协议基础FTP (RFC 959)FTP SSL/TLS (RFC 4217)SSH…