企业网站建设相关书籍,百度关键词怎么做排名,建设银行人力资源系统网站怎么进,长沙建网站设计公司前言
多阶段构建#xff08;Multi-stage builds#xff09;是从 Docker 17.05 版本开始引入的功能。这个功能允许在单个 Dockerfile 中定义多个构建阶段#xff0c;并且在最终镜像中只包含所需的内容#xff0c;从而减小镜像的大小。通过多阶段构建#xff0c;可以将构建…前言
多阶段构建Multi-stage builds是从 Docker 17.05 版本开始引入的功能。这个功能允许在单个 Dockerfile 中定义多个构建阶段并且在最终镜像中只包含所需的内容从而减小镜像的大小。通过多阶段构建可以将构建环境和运行环境分开使得最终的镜像更加轻量化减少了不必要的依赖和文件
使用多阶段构建
# syntaxdocker/dockerfile:1
FROM golang:1.21
WORKDIR /src
COPY EOF ./main.go
package mainimport fmtfunc main() {fmt.Println(hello, world)
}
EOF
RUN go build -o /bin/hello ./main.goFROM scratch
COPY --from0 /bin/hello /bin/hello
CMD [/bin/hello] 如上例子可以有两个或多个 FROM 关键字第一个 FROM 阶段作的事相当于把程序编译成一个二进制文件第二个 FROM 阶段从第一阶段拷贝编译后的产物这样最终生成镜像的体积因为丢弃了编译阶段的依赖了就小了很多 命名构建阶段
上面的例子因为没有设置别名默认情况 docker 内部会给每一个 FROM 按顺序从 0 开始自增设置编号所以我们用了 COPY --from0 /bin/hello /bin/hello这样的方式来引用这样缺点在于如果构建阶段的顺序发生了变化那么我们引用的编号也要修改这样就不够优雅了好在支持设置别名功能将上面的例子改造后如下
# syntaxdocker/dockerfile:1
FROM golang:1.21 as build
WORKDIR /src
COPY EOF /src/main.go
package mainimport fmtfunc main() {fmt.Println(hello, world)
}
EOF
RUN go build -o /bin/hello ./main.goFROM scratch
COPY --frombuild /bin/hello /bin/hello
CMD [/bin/hello]
构建部分阶段
多阶段构建支持构建部分 FROM 的内容这样可以方便调试比如我想看下编译后的内容就没必要每次还得执行编译后的其他阶段使用方法如下
docker build --target build -t hello .
从外部镜像作拷贝数据
前面我们都是从上一个 FROM 阶段拷贝的数据假如我已经有现成的镜像了在使用 FROM 拷贝就略显得臃肿了好在 COPY --from 指令支持从单独的镜像本地或远程里面拷贝数据使用如下
COPY --fromnginx:latest /etc/nginx/nginx.conf /nginx.conf
这个功能非常有用假如我们应用镜像运行时依赖多个中间件才能正常工作那么传统的做法需要做一个大而全的基础镜像通过这种方式我们就可以组合出更灵活按需适配的场景从而大幅度减小优化镜像的体积
使用上一阶段作为新阶段
这个很简单就是可以使用上一阶段构建完的结构作为新的阶段的起步依赖例子如下
# syntaxdocker/dockerfile:1FROM alpine:latest AS builder
RUN apk --no-cache add build-baseFROM builder AS build1
COPY source1.cpp source.cpp
RUN g -o /binary source.cppFROM builder AS build2
COPY source2.cpp source.cpp
RUN g -o /binary source.cpp BuildKit和普通的builder的区别
BuildKit 于 Docker 18.09 版本开始引入。BuildKit 旨在提供更快速、更灵活、更安全的构建体验以及更好的多阶段构建支持。
BuildKit 仅仅构建其依赖的前置而 builder 则会构建所有依赖如下例子
# syntaxdocker/dockerfile:1
FROM ubuntu AS base
RUN echo baseFROM base AS stage1
RUN echo stage1FROM base AS stage2
RUN echo stage2 激活 BuildKit 后仅仅需要构建 base和 stage2 即可
DOCKER_BUILDKIT1 docker build --no-cache -f Dockerfile --target stage2 .
没激活 BuildKit 后则需要构建 basestage1 和 stage2
DOCKER_BUILDKIT0 docker build --no-cache -f Dockerfile --target stage2 .
总结
使用多阶段构建可以帮助优化和简化容器镜像的构建过程减小镜像大小简化构建流程提升构建灵活性加速构建速度优化镜像层次结构减少依赖关系从而提高了容器化应用程序的部署效率和性能