Docker的分阶段构建
- Published on
- Reading time
- 4 min read
- Likes
Docker的分阶段构建功能允许开发人员将Dockerfile中的不同部分独立构建,以便在构建过程中尽可能地共享已构建的内容,从而减少构建时间并减小镜像大小。这种方法不仅提高了构建效率,还优化了Docker镜像的存储空间,使得容器的启动速度更快。
步骤
在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 /app/build /usr/share/nginx/html
在这个例子中,我们将前端应用程序的构建和Nginx服务器的部署分为两个阶段:
- 第一阶段使用Node.js构建前端应用程序。通过安装依赖并运行构建命令,生成最终的应用文件。
- 第二阶段使用Nginx服务器来部署前端应用程序。将构建出的文件复制到Nginx所需的目录中。
graph TD A[开始构建] --> B[构建阶段1: Node.js] B --> C[安装依赖] C --> D[运行构建命令] D --> E[生成应用文件] E --> F[构建阶段2: Nginx] F --> G[复制构建文件到Nginx] G --> H[启动Nginx服务] H --> I[部署完成]
使用 --target 参数来选择特定的构建阶段
例如,要选择前面示例中的第一个构建阶段,可以在构建过程中使用以下命令:
bashEavan.dev
docker build --target=builder -t my-app .
这将只构建第一个阶段,并将其命名为builder
。这样,开发者可以针对不同的阶段进行调试和测试。
使用 --from 参数来复制一个或多个之前构建的阶段中的文件
例如,要在第二个阶段中复制第一个阶段中构建的文件,可以使用以下命令:
dockerfileEavan.dev
COPY /app/build /usr/share/nginx/html
这将复制第一个阶段中构建的文件到第二个阶段中的Nginx服务器,从而实现了有效的文件共享。
Docker的分阶段构建功能可以使构建过程更高效和可重复,同时还可以减小镜像大小,从而提高Docker容器的性能。通过合理利用这一特性,开发者能够更快地迭代和部署应用。
附带一个自己项目中的 Next.js 的 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 /app/.next ./.next
COPY /app/public ./public
COPY /app/next.config.mjs ./
COPY /app/package.json ./
USER nextjs
CMD ["npm", "start"]
EXPOSE 3000
在这个示例中,我们同样采用了分阶段构建的策略,首先构建Next.js应用,然后在一个新的较小的镜像中运行它。这样做不仅减少了最终镜像的大小,还提高了应用的安全性和性能。
如未标记非原创,转载请联系站长获得授权,非商业转载请注明本文出处及文章链接,未经站长允许不得对文章文字内容进行修改演绎,不得用于商业目的。
本文采用CC BY-NC-SA 4.0 - 非商业性使用 - 相同方式共享 4.0 国际进行许可。
本文采用CC BY-NC-SA 4.0 - 非商业性使用 - 相同方式共享 4.0 国际进行许可。