为云中构建进行优化

Docker Build Cloud 在远程环境中运行构建任务,而非在您执行构建命令的本地机器上运行。这意味着客户端与构建器之间的文件传输需通过网络进行。

通过网络传输文件的延迟更高、带宽更低, 而本地传输则相反。Docker Build Cloud 提供了多项功能来缓解这一问题:

  • 它使用附加的存储卷来存储构建缓存,从而使得缓存的读取和写入速度非常快。
  • 将构建结果加载回客户端时,仅拉取与先前构建相比已更改的层。

尽管进行了这些优化,对于大型项目或网络连接较慢的情况,远程构建仍可能导致上下文传输和镜像加载缓慢。以下是您可以优化构建流程以提高传输效率的一些方法:

有关如何优化构建的更多信息,请参阅 构建最佳实践

Docker 忽略文件

使用一个 .dockerignore 文件, 您可以明确指定在构建上下文中不希望包含的本地文件。在忽略文件中通过通配符模式匹配到的文件将不会被传输到远程构建器。

您可能希望添加到 .dockerignore 文件中的内容示例如下:

  • .git — 跳过在构建上下文中发送版本控制历史。需要注意的是,这意味着您将无法在构建步骤中运行 Git 命令,例如 git rev-parse
  • 包含构建产物(如Binaries)的目录。开发过程中本地创建的构建产物。
  • 包管理器的供应商目录,例如 node_modules

通常,您的 .dockerignore 文件的内容应与 .gitignore 文件中的内容相似。

精简版基础镜像

在Dockerfile中的FROM指令中选择更小的镜像, 有助于减小最终镜像的体积。例如, Alpine镜像 就是一个极简的Docker镜像示例,它提供了 Linux 容器中您期望的所有操作系统工具。

还有一个 特殊scratch镜像, 该镜像中不包含任何内容。例如,可用于构建静态链接的Binaries镜像。

多阶段构建

多阶段构建可使构建过程运行得更快,因为各个阶段可以并行执行。它还能使最终生成的镜像体积更小。 请以如下方式编写Dockerfile:确保最终运行阶段所使用的基镜像尽可能小,仅包含程序运行所需的必要资源。

也可以通过Dockerfile的COPY --from指令, 从其他镜像或构建阶段复制资源, 这种技术可以减少最终阶段的层数,以及各层的大小。

在构建过程中获取远程文件

尽可能地,您应在构建过程中从远程位置获取文件,而不是将文件打包进构建上下文中。直接在 Docker Build Cloud 服务器上下载文件更为理想,因为这种方式通常比随构建上下文传输文件更快。

您可以在构建期间使用 Dockerfile ADD 指令获取远程文件, 或在您的 RUN 指令中使用 wgetrsync 等工具。

多线程工具

一些在构建指令中使用的工具默认可能不会利用多个核心。其中一个例子是 make,它默认只使用单个线程,除非您指定 make --jobs=<n> 选项。对于涉及此类工具的构建步骤,请尝试检查是否可以通过并行化来优化执行。