docker中多阶段构建与单阶段构建的具体使用

 更新时间:2025年09月30日 10:09:50   作者:{⌐■_■}  
本文主要介绍了docker中多阶段构建与单阶段构建的具体使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

单阶段构建(Single-Stage Build)

在单阶段构建中,所有构建过程都在一个镜像中完成。构建工具和最终的运行时环境都包含在同一个镜像中,导致最终镜像的体积较大。

单阶段构建 Dockerfile 示例:

FROM golang:1.18
WORKDIR /app
COPY ./helloworld /app/
// 设置 Go 代理环境变量
ENV GO111MODULE=on
ENV GOPROXY=https://goproxy.cn,direct  // 使用中国的 Go 代理,确保更快速的包下载
RUN go mod tidy
RUN CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -o app .
EXPOSE 80
CMD ["./app", "--param1=p1", "--param2=p2"]

优缺点:

  • 优点:
    • 构建过程简单,只有一个阶段。
  • 缺点:
    • 最终镜像包含构建工具(如 go 工具链),使镜像体积较大。
    • 不适合生产环境,因为镜像中包含了构建相关的工具和源代码,可能带来安全问题。
    • 运行时环境包含不必要的构建工具和依赖,增加了攻击面和容器的启动时间。

多阶段构建(Multi-Stage Build)

在多阶段构建中,构建过程被分成多个阶段。每个阶段可以使用不同的基础镜像,最终镜像只包含必要的运行时环境和构建完成的二进制文件。
这种方法的好处是可以显著减小最终镜像的体积,同时避免将不必要的构建工具和依赖包含在生产环境的镜像中。

多阶段构建 Dockerfile 示例:

# 第一阶段:构建 Go 应用
FROM golang:1.18 AS builder
WORKDIR /go/src/helloworld
COPY ./helloworld /go/src/helloworld
// 设置 Go 代理环境变量
ENV GO111MODULE=on
ENV GOPROXY=https://goproxy.cn,direct  // 使用中国的 Go 代理,确保更快速的包下载
RUN go mod tidy
RUN CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -o app .

# 第二阶段:运行 Go 应用
FROM alpine:latest
WORKDIR /app
COPY --from=builder /go/src/helloworld/app /app/
EXPOSE 80
CMD ["./app", "--param1=p1", "--param2=p2"]

优缺点:

  • 优点:
    • 可以有效减少最终镜像的体积,只包含运行时环境和必要的二进制文件。
    • 可以选择不同的镜像来进行不同的构建步骤,例如使用 golang 镜像构建代码,使用更小的 alpine 镜像运行应用。
    • 避免了构建工具和源代码暴露在最终镜像中,提高了安全性。
  • 缺点:
    • Dockerfile 更复杂,因为需要为不同的阶段指定不同的镜像。
    • 构建过程较为冗长,需要多个阶段来完成构建和运行,可能稍微增加构建时间。

对比总结

  • 单阶段构建:构建和运行都在同一个镜像中完成,最终镜像较大,包含了构建工具和源代码。

    • 适合小型项目或快速开发,但不适合生产环境。
    • 镜像较大,不适合持续交付或生产环境部署。
  • 多阶段构建:将构建过程分为多个阶段,最终镜像只包含需要的运行时环境和构建完成的二进制文件。

    • 适合生产环境,能够减小镜像体积,避免不必要的构建工具暴露在镜像中。
    • 更适合复杂项目或对镜像大小、安全性有较高要求的场景。

到此这篇关于docker中多阶段构建与单阶段构建的具体使用的文章就介绍到这了,更多相关docker 多阶段构建与单阶段构建内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • docker打包python镜像的全教程分享

    docker打包python镜像的全教程分享

    Docker是一种开源的容器化平台,可以让开发者将应用程序和其依赖项打包到一个可移植的容器中,然后在不同的环境中运行,本文主要给大家介绍了docker打包python镜像全教程,需要的朋友可以参考下
    2024-02-02
  • 解决Docker Image镜像无法删除问题的方法

    解决Docker Image镜像无法删除问题的方法

    这篇文章主要给大家介绍了关于如何解决Docker Image镜像无法删除问题的方法,文中通过示例代码将解决的方法介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧。
    2018-01-01
  • Docker实现容器之间通信的多种方式

    Docker实现容器之间通信的多种方式

    在 Docker 中,实现容器之间的通信有多种方式,核心在于网络配置,下面我从 基础原理、常见方式、最佳实践、以及 docker-compose 方式 全面讲解,需要的朋友可以参考下
    2025-06-06
  • 使用Docker快速运行Firefox并实现远程访问本地火狐浏览器的详细过程

    使用Docker快速运行Firefox并实现远程访问本地火狐浏览器的详细过程

    文章介绍了如何在Docker中运行Firefox浏览器,并通过Cpolar内网穿透工具实现远程访问,步骤包括部署Firefox、本地访问、安装Cpolar、配置公网地址、设置固定二级子域名等,本文给大家介绍的非常详细,感兴趣的朋友一起看看吧
    2025-02-02
  • docker 动态映射运行的container端口实例详解

    docker 动态映射运行的container端口实例详解

    这篇文章主要介绍了 docker 动态映射运行的container端口实例详解的相关资料,需要的朋友可以参考下
    2016-10-10
  • Docker 的健康检测机制

    Docker 的健康检测机制

    这篇文章主要介绍了Docker 的健康检测机制。即检验进程是否存活,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-12-12
  • Docker启动PostgreSQL时创建多个数据库的解决方案

    Docker启动PostgreSQL时创建多个数据库的解决方案

    这篇文章主要介绍了Docker启动PostgreSQL时创建多个数据库的解决方案,重点给大家介绍如何把shell/sql脚本放入/docker-entrypoint-initdb.d/目录中,让容器启动的时候自动执行创建
    2021-06-06
  • 详解使用Docker容器来源码编译etcd

    详解使用Docker容器来源码编译etcd

    这篇文章主要介绍了详解使用Docker容器来源码编译etcd,具有一定的参考价值,感兴趣的小伙伴们可以参考一下。
    2017-03-03
  • 教你使用如何docker部署淘宝rap2服务

    教你使用如何docker部署淘宝rap2服务

    这篇文章主要介绍了教你使用如何docker部署淘宝rap2服务,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-08-08
  • docker 环境搭建、docker 与容器常用指令大全(推荐)

    docker 环境搭建、docker 与容器常用指令大全(推荐)

    这篇文章主要介绍了docker 环境搭建、docker 与容器常用指令大全,主要包括docker容器操作命令汇总,文中介绍需要注意的是如果想要删除一个容器,需要先停止该容器且如果镜像中有运行状态的容器,也是无法删除容器的,需要的朋友可以参考下
    2022-06-06

最新评论