优化云端构建
Docker Build Cloud 在远程运行您的构建,而不是在您发起构建的机器上。这意味着客户端和构建器之间的文件传输是通过网络进行的。
通过网络传输文件比本地传输具有更高的延迟和更低的带宽。Docker Build Cloud 有几个功能可以缓解这个问题
- 它使用附加的存储卷作为构建缓存,这使得读取和写入缓存非常快速。
- 将构建结果加载回客户端时,只会拉取与先前构建相比发生变化的层。
尽管有这些优化,对于大型项目或网络连接缓慢的情况,远程构建仍然可能导致上下文传输和镜像加载缓慢。以下是一些优化构建以提高传输效率的方法
有关如何优化构建的更多信息,请参阅构建最佳实践。
.dockerignore 文件
使用 .dockerignore
文件,您可以明确指定哪些本地文件不希望包含在构建上下文中。忽略文件中指定的 glob 模式捕获的文件不会传输到远程构建器。
以下是一些您可能希望添加到 .dockerignore
文件中的示例:
.git
— 跳过在构建上下文中发送版本控制历史记录。请注意,这意味着您将无法在构建步骤中运行 Git 命令,例如git rev-parse
。- 包含构建构件的目录,例如二进制文件。在开发过程中本地创建的构建构件。
- 包管理器的供应商目录,例如
node_modules
。
通常,您的 .dockerignore
文件内容应与您的 .gitignore
文件内容类似。
精简基础镜像
在 Dockerfile 中为 FROM
指令选择较小的镜像有助于减小最终镜像的大小。Alpine 镜像 是一个极简 Docker 镜像的良好示例,它提供了您期望从 Linux 容器获得的所有 OS 工具。
还有一个特殊的 scratch
镜像,它完全不包含任何内容。例如,对于创建静态链接二进制文件的镜像很有用。
多阶段构建
多阶段构建可以使您的构建运行更快,因为阶段可以并行运行。它还可以使最终结果更小。编写 Dockerfile 时,应确保最终运行时阶段使用尽可能小的基础镜像,仅包含程序运行所需的资源。
还可以使用 Dockerfile 的 COPY --from
指令,从其他镜像或阶段复制资源。此技术可以减少最终阶段的层数及其大小。
在构建中获取远程文件
如果可能,您应在构建过程中从远程位置获取文件,而不是将文件打包到构建上下文中。直接在 Docker Build Cloud 服务器上下载文件更好,因为它可能比通过构建上下文传输文件更快。
您可以在构建过程中使用 Dockerfile 的 ADD
指令,或在 RUN
指令中使用 wget
和 rsync
等工具来获取远程文件。
多线程工具
您在构建指令中使用的某些工具默认可能不会利用多核。一个例子是 make
,它默认使用单线程,除非您指定 make --jobs=<n>
选项。对于涉及此类工具的构建步骤,请尝试检查是否可以通过并行化来优化执行。