首页 > 运维 > Docker > 如何在Docker中使用多级版本来创建较小,更安全的图像?

如何在Docker中使用多级版本来创建较小,更安全的图像?

Johnathan Smith
发布: 2025-03-14 14:15:35
原创
454 人浏览过

如何在Docker中使用多级版本来创建较小,更安全的图像?

Docker中的多级版本是一项功能,它允许您使用Dockerfile中的FROM中的多个。每个FROM都可以启动构建过程的新阶段,您可以将工件从一个阶段复制到另一个阶段。该方法对于通过将构建环境与运行时环境区分开来创建较小,更安全的Docker图像特别有用。

这是您可以使用多阶段构建来实现这一目标的方法:

  1. 定义构建阶段:首先定义一个构建阶段,在该阶段中,您可以编译应用程序或准备工件。例如,您可以使用golang图像来编译GO应用程序。

     <code class="Dockerfile">FROM golang:1.16 as builder WORKDIR /app COPY . . RUN go build -o myapp</code>
    登录后复制
  2. 定义运行时阶段:在构建阶段之后,用最小的基本图像定义运行时阶段。仅将构建阶段的必要工件复制到此运行时阶段。

     <code class="Dockerfile">FROM alpine:3.14 COPY --from=builder /app/myapp /myapp CMD ["/myapp"]</code>
    登录后复制

通过使用多阶段构建,您最终获得了最终图像,该图像仅包含运行您的应用程序所需的内容,该应用程序要小得多,并且与用于构建的图像相比,它具有更少的潜在漏洞。

在多阶段码头版中组织代码的最佳实践是什么?

在多阶段的Docker构建中有效地组织代码可以大大提高您的Dockerfile的效率和清晰度。以下是一些最佳实践:

  1. 单独的问题:将不同的阶段用于不同的目的(例如,建筑物,测试和部署)。这种关注的分离使您的Dockerfile更容易理解和维护。

     <code class="Dockerfile"># Build stage FROM node:14 as builder WORKDIR /app COPY package*.json ./ RUN npm install COPY . . RUN npm run build # Test stage FROM node:14 as tester WORKDIR /app COPY --from=builder /app . RUN npm run test # Runtime stage FROM node:14-alpine WORKDIR /app COPY --from=builder /app/build /app/build CMD ["node", "app/build/index.js"]</code>
    登录后复制
  2. 最小化层的数量:在可能的情况下组合运行命令以减少图像中的层数。这种练习不仅加快了构建过程,而且还使结果图像较小。

     <code class="Dockerfile">RUN apt-get update && \ apt-get install -y some-package && \ rm -rf /var/lib/apt/lists/*</code>
    登录后复制
  3. 使用.dockerignore :创建一个.dockerignore文件,以排除不必要的文件被复制到Docker构建上下文中。这加快了构建过程并降低图像大小。
  4. 优化复制操作:仅复制每个阶段所需的文件。例如,在node.js应用程序的构建阶段中,您可以首先复制package.json ,运行npm install ,然后复制应用程序的其余部分。
  5. 使用名称阶段:在您的阶段给出有意义的名称,以使Dockerfile易于阅读和维护。

如何优化多阶段Docker构建中的缓存以改善构建时间?

在多阶段码头版中优化缓存可以大大减少构建时间。以下是实现这一目标的几种策略:

  1. 操作顺序:将经常更改的命令放在Dockerfile的尽头。 Docker将从Dockerfile的开头缓存层,从而加快后续构建。

     <code class="Dockerfile">FROM node:14 as builder WORKDIR /app COPY package*.json ./ RUN npm install COPY . . RUN npm run build</code>
    登录后复制

    在此示例中, npm install更改可能性较小,因此已放置在COPY . .命令。

  2. 使用多阶段构建:每个阶段都可以独立缓存。这意味着您可以在每个阶段利用构建缓存,从而节省后续版本的时间。
  3. Leverage BuildKit :Docker BuildKit提供了改进的构建缓存机制。通过设置环境变量DOCKER_BUILDKIT=1启用buildKit,然后使用新的RUN --mount命令来安装缓存目录。

     <code class="Dockerfile"># syntax=docker/dockerfile:experimental FROM golang:1.16 as builder RUN --mount=type=cache,target=/root/.cache/go-build \ go build -o myapp</code>
    登录后复制
  4. 最小化Docker构建上下文:使用.dockerignore文件将不必要的文件从构建上下文中排除。较小的上下文意味着更少的数据传输和更快的构建。
  5. 使用特定的基本图像:使用轻质和稳定的基本图像减少在构建过程中拉动基层所需的时间。

与单级版本相比,多阶段码头版提供哪些安全益处?

与单级版本相比,多阶段的Docker Build提供了一些安全优势:

  1. 较小的图像大小:通过仅将必要的工件从构建阶段复制到运行时阶段,多阶段的构建会导致更小的最终图像。较小的图像具有降低的攻击表面,因为它们包含较少的组件可能脆弱。
  2. 减少漏洞:由于最终图像不包括构建工具或依赖性仅在构建过程中所需的依赖性,因此攻击者在这些工具中利用漏洞的机会更少。
  3. 构建和运行时环境的隔离:多阶段构建使您可以使用不同的基本图像来构建和运行应用程序。构建环境可以更具允许性,并包括编译或包装所需的工具,而运行时环境可以更限制和优化安全性。
  4. 更容易的合规性:较小,更集中的图像更容易扫描漏洞并确保遵守安全策略,从而更容易维护安全的环境。
  5. 限制秘密暴露:由于敏感数据(例如构建过程中使用的API密钥)不需要包含在最终图像中,因此多阶段构建可以帮助防止在运行时环境中揭示秘密。

通过利用多阶段构建,您可以显着增强Docker图像的安全姿势,同时还可以优化其大小和性能。

以上是如何在Docker中使用多级版本来创建较小,更安全的图像?的详细内容。更多信息请关注PHP中文网其他相关文章!

本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板