减少容器镜像数据传输
- Tier: 基础版,专业版,旗舰版
- Offering: JihuLab.com,私有化部署
根据从容器仓库下载镜像或标签的频率,数据传输可能会相当高。此页面提供了一些建议和提示,以减少您通过容器仓库传输的数据量。
检查数据传输使用情况
传输使用情况在极狐 GitLab UI 中不可用。
确定镜像大小
使用这些工具和技术来确定您的镜像大小:
-
Skopeo:使用 Skopeo inspect 命令通过 API 调用检查层数和大小。因此,您可以在运行 docker pull IMAGE 之前检查此数据。
-
CI 中的 Docker:在使用极狐 GitLab CI 推送镜像之前检查并记录镜像大小。例如:
shelldocker inspect "$CI_REGISTRY_IMAGE:$IMAGE_TAG" \ | awk '/"Size": ([0-9]+)[,]?/{ printf "Final Image Size: %d\n", $2 }'
-
Dive 是一个用于探索 Docker 镜像、层内容并发现减少其大小的方法的工具。
减少镜像大小
使用更小的基础镜像
考虑使用更小的基础镜像,例如 Alpine Linux。Alpine 镜像大约为 5 MB,比 Debian 等流行基础镜像小好几倍。如果您的应用程序是作为自包含静态二进制文件分发的,例如 Go 应用程序,您还可以考虑使用 Docker scratch 基础镜像。
如果您需要使用特定的基础镜像操作系统,请寻找 -slim 或 -minimal 版本,因为这有助于减少镜像大小。
同时要注意您在基础镜像上安装的操作系统软件包,这些软件包可能会增加数百兆字节的大小。尝试将安装的软件包数量保持在最低限度。
多阶段构建 可以成为清理临时构建依赖项的强大助手。
您还可以考虑使用以下工具:
- DockerSlim 提供了一组命令来减少容器镜像的大小。
- Distroless 镜像仅包含您的应用程序及其运行时依赖项。它们不包含包管理器、shell 或您期望在标准 Linux 发行版中找到的任何其他程序。
最小化层
Dockerfile 中的每个指令都会导致新的一层,这记录了在该指令期间应用的文件系统更改。一般来说,更多或更大的层会导致更大的镜像。尝试减少在 Dockerfile 中安装软件包的层数。否则,这可能导致构建过程中的每一步都增加镜像大小。
有多种策略可以减少层的数量和大小。例如,与其为每个要安装的操作系统软件包使用一个 RUN 命令(这会导致每个软件包都有一个层),不如在单个 RUN 命令中安装所有软件包,以减少构建过程中的步骤并减少镜像大小。
另一个有用的策略是确保您在安装软件包之前和之后删除所有临时构建依赖项并禁用或清空操作系统包管理器缓存。
构建镜像时,请确保仅复制相关文件。对于 Docker,使用 .dockerignore 可以确保构建过程忽略不相关的文件。
您可以使用其他第三方工具来缩小镜像,例如 DockerSlim。请注意,如果使用不当,此类工具可能会删除应用程序在特定条件下运行所需的依赖项。因此,最好在构建过程中努力获得较小的镜像,而不是尝试在构建后缩小镜像。
使用多阶段构建
使用多阶段构建,您可以在 Dockerfile 中使用多个 FROM 语句。每个 FROM 指令可以使用不同的基础镜像,并且每个指令开始一个新的构建阶段。您可以选择性地从一个阶段复制产物到另一个阶段,留下您不希望在最终镜像中出现的所有内容。这在您需要安装构建依赖项但不需要它们出现在最终镜像中时特别有用。
使用镜像拉取策略
当使用 docker 或 docker+machine 执行器时,您可以在 runner config.toml 中设置 pull_policy 参数,该参数定义了 runner 在拉取 Docker 镜像时的工作方式。为了避免在使用大型且很少更新的镜像时传输数据,请考虑在从远程仓库拉取镜像时使用 if-not-present 拉取策略。
使用 Docker 层缓存
运行 docker build 时,Dockerfile 中的每个命令都会产生一个层。这些层被作为缓存保存,并且如果没有更改,可以重复使用。您可以通过使用 --cache-from 参数指定一个标记的镜像作为 docker build 命令的缓存源。可以使用多个 --cache-from 参数指定多个镜像作为缓存源。这可以加快构建速度并减少传输的数据量。有关更多信息,请参阅 Docker 层缓存文档。
检查自动化频率
我们经常创建捆绑到容器镜像中的自动化脚本,以在特定时间间隔执行常规任务。如果自动化是将容器镜像从极狐 GitLab 仓库拉取到极狐 GitLab.com 之外的服务,您可以减少这些间隔的频率。