Docker的分阶段构建

Published on
Reading time
3 min read
Authors

Docker的分阶段构建功能允许开发人员将Dockerfile中的不同部分独立构建,以便在构建过程中尽可能地共享已构建的内容,从而减少构建时间并减小镜像大小。

步骤

在Dockerfile中定义不同的构建阶段,使用AS命令来命名这些阶段。例如:

dockerfileEavan.dev
FROM node:12.18.3-alpine AS builder
WORKDIR /app
COPY . .
RUN npm install && npm run build

FROM nginx:1.19.2-alpine
COPY --from=builder /app/build /usr/share/nginx/html

在这个例子中,我们将前端应用程序的构建和Nginx服务器的部署分为两个阶段

  • 第一阶段使用Node.js构建前端应用程序
  • 第二阶段使用Nginx服务器来部署前端应用程序

使用-target参数来选择特定的构建阶段

例如,要选择前面示例中的第一个构建阶段,可以在构建过程中使用以下命令:

dockerfileEavan.dev
docker build --target=builder -t my-app .

这将只构建第一个阶段,并将其命名为builder。

使用-from参数来复制一个或多个之前构建的阶段中的文件。

例如,要在第二个阶段中复制第一个阶段中构建的文件,可以使用以下命令:

dockerfileEavan.dev
COPY --from=builder /app/build /usr/share/nginx/html

这将复制第一个阶段中构建的文件到第二个阶段中的Nginx服务器。

Docker的分阶段构建功能可以使构建过程更高效和可重复,同时还可以减小镜像大小,从而提高Docker容器的性能。

附带一个自己项目中的nextjs的Dockerfile

dockerfileEavan.dev
FROM node:18-alpine AS builder
WORKDIR /app
COPY package*.json ./
RUN npm config set registry https://registry.npmmirror.com
RUN npm install
COPY . .
RUN npm run build


FROM node:18-alpine AS runner
ENV NODE_ENV=production
RUN addgroup -g 1001 -S nodejs
RUN adduser -S nextjs -u 1001
WORKDIR /app

COPY package*.json ./

RUN npm config set registry https://registry.npmmirror.com
RUN npm install --omit=dev

COPY --from=builder /app/.next ./.next
COPY --from=builder /app/public ./public
COPY --from=builder /app/next.config.mjs ./
COPY --from=builder /app/package.json ./

USER nextjs
CMD ["npm", "start"]

EXPOSE 3000