在 Docker 中,使用多阶段构建可以帮助减小镜像的体积。多阶段构建允许在一个 Dockerfile 中定义多个 FROM 语句,每个 FROM 语句代表一个构建阶段。最终的镜像只包含最后一个构建阶段的结果,而之前的阶段将被丢弃。
以下是一个简单的例子:
dockerfile复制代码
# 第一阶段:编译应用程序
FROM node:14-alpine AS builder
WORKDIR /app
COPY package*.json ./
RUN npm install --silent
COPY . .
RUN npm run build
# 第二阶段:将编译后的文件拷贝到新的容器中
FROM nginx:stable-alpine
COPY --from=builder /app/build /usr/share/nginx/html
EXPOSE 80
CMD ["nginx", "-g", "daemon off;"]
在上面的示例中,Dockerfile 中定义了两个阶段。第一个阶段使用 Node.js 镜像来编译应用程序,并将它们放在 /app/build
目录中。第二个阶段使用 Nginx 镜像来托管静态文件,在这里我们把编译好的应用程序复制到了 /usr/share/nginx/html
目录下。最后,我们使用 EXPOSE
指令来暴露端口,并使用 CMD
来启动 Nginx 服务器。
注意,第二个阶段中使用了 --from
参数来指定要复制文件的阶段,这是多阶段构建中使用的关键。
通过使用多阶段构建,我们可以减小镜像的体积,同时还能够提高安全性和可维护性。因为在第二个阶段中不包括任何构建依赖项,所以我们可以避免将开发、编译和测试工具打包进最终的生产镜像中。
Docker 17.05 版本引入了多阶段构建(Multi-Stage Builds)的特性,因此从 Docker 17.05 版本开始就支持多阶段构建。在之前的版本中,只能使用单一的 Dockerfile 来构建镜像,所以无法实现多阶段构建的功能。
多阶段构建是一个非常有用的特性,可以帮助我们减小 Docker 镜像的体积,同时还能提高安全性和可维护性。通过使用多阶段构建,我们可以将不同的构建阶段分离出来,并在最后一个阶段中复制所需的文件,从而避免将开发、编译和测试工具打包进最终的生产镜像中。
总之,如果想要使用 Docker 的多阶段构建特性,需要确保您的 Docker 版本不低于 17.05 版本。