使用多阶段Dockerfile构建微小的Node.js Docker镜像

时间:2020-01-09 10:34:23  来源:igfitidea点击:

说明

在构建Docker镜像时,存储效率非常重要。在本教程中,我们将学习如何轻松构建尽可能小的Node.js镜像,而无需以前在Docker文件中使用的典型hack。

Docker镜像由几层组成,每一层对应于我们在Dockerfile中编写的每个命令。每层都受到其上一层的影响,并且当堆叠在一起时,会形成一个完整的Docker镜像。

使用Stages

大多数Dockerfile以一个FROM命令开头,这是我们放置源镜像名称和版本的位置。

一个多阶段Dockerfiles具有多个FROM指令,后跟用于运行命令或者设置选项的其他指令。

FROM node:12-alpine AS build
RUN apk install ...

FROM node:12-alpine AS release
COPY —from-stage=build /build/artifact1 /app

多阶段Dockerfile的每个阶段都将使用其自己的层缓存,并且每个阶段都可以从另一个阶段复制文件。

这使我们能够在一个阶段中构建Node.js应用程序,在该阶段中,我们将安装所有构建依赖项,然后将构建工件复制到最终阶段。

NPM安装阶段

每个Node.js构建都有至少一个动作,即npm install阶段。此阶段将拉下依赖关系,并且通常需要其中一些依赖关系进行编译。

例如,要编译我们的依赖项,我们需要运行Node.js Express API不需要的许多程序包。使用Dockerfile多阶段,我们可以创建一个阶段来获取和编译NPM依赖项。

首先创建一个基础镜像,将应用程序源复制到该镜像中。

FROM node:12-alphine AS base
COPY /app /app

接下来,我们可以创建构建阶段,该阶段将获取并编译所有Node依赖项。

FROM node:8-alpine AS build
RUN apk install \
        python \
        make \
        g++
COPY --from-stage=base /app /app
RUN npm install

最后,我们创建一个发布阶段,该复制阶段将从基础阶段复制源文件,并从构建阶段复制工件。

FROM node:12-alphine AS release
COPY /app /app

综上所述,我们最终的Dockerfile将类似于以下示例。请注意,每个阶段都在一个文件中表示。

FROM node:12-alphine AS base
COPY /app /app

FROM node:8-alpine AS build
RUN apk install \
        python \
        make \
        g++
COPY --from-stage=base /app /app
RUN npm install

FROM node:12-alphine AS release
COPY /app /app