【问题标题】:Using docker with many cross build toolchains将 docker 与许多交叉构建工具链一起使用
【发布时间】:2021-01-16 03:09:41
【问题描述】:

在我的团队中,我们目前使用单个 docker 镜像来交叉构建一个 SW 库,我们在一个 docker 镜像 (/opt/...) 中添加了多个交叉构建工具链。 Dockerfile 和工具链都在一个 git 存储库中(通过 git-lfs 归档工具链)。

Dockerfile方便对构建环境有全面的形式化描述,可以在不同的机器上使用。

现在,我们不断从客户那里获得工具链,有时还会获得这些工具链的新版本。 因此,我们的 docker 镜像增长很快,目前使用了大约 40GB。更糟糕的是,如果我们需要添加/修改/删除一个工具链,构建一个新的 docker 镜像所花费的时间。

所以我开始怀疑我们是否以“良好实践”的方式做事。

为每个工具链使用单独的 docker 映像可以节省每次构建巨大的单个 docker 映像的时间。但在空间方面则更糟(因为每个 docker 映像都包含带有构建工具等的 Linux 子系统)。

如果有任何提示可以更好地做到这一点,我会很高兴。

  • 是否有任何“既定”的方法来处理这种情况?
  • 其他团队如何处理这个用例?

【问题讨论】:

  • 如果你的工具链是千兆字节,基本的 Linux 发行版几乎是免费的;此外,如果您构建了多个映像 FROM ubuntu:18.04 并将它们全部构建在一起,它们将共享一个基础映像的副本。

标签: docker cross-compiling toolchain


【解决方案1】:

图层

为每个工具链使用单独的 docker 映像可以节省每次构建巨大的单个 docker 映像的时间。但在空间方面情况更糟(因为每个 docker 映像都包含带有构建工具等的 Linux 子系统)。

由于一个名为 layers 的 Docker 功能,这大多不是真的。

什么是层?每次您在 Dockerfile 中有一个命令时,都会创建一个新层,其中包含自上一层创建以来更改的文件。一旦创建,层是不可变的。

这会给你带来两件事。

  • 首先你可以拥有“构建缓存”。如果您更改 Dockerfile 中的最后一条命令,并重新运行整个内容,则只需重新运行最后一条命令。其他所有内容都将从缓存中获取。
  • 它完成的第二件事是,如果多个 docker 映像具有相同的层,它们可以共享磁盘上的这些层。第一次使用基于 Ubuntu 的映像时,需要花费几 GB。第二次,它不会花费任何费用。

构建自定义基础映像

之前,我说“大部分”不是真的。有什么注意事项?

有一种方法可以减小许多不同图像的大小。如果您可以识别其中许多人使用的常见依赖项,则可以节省空间将该依赖项提取到“基础映像”中。

假设您有两个 Docker 映像,由以下 Dockerfile 定义:

# Image A
FROM ubuntu:latest
RUN apt-get install -y foo
RUN apt-get install -y gcc
# Image B
FROM ubuntu:latest
RUN apt-get install -y bar
RUN apt-get install -y gcc

这里我们有两个镜像,它们都安装了 gcc。但是,gcc 的两次安装将创建两个层,因为 Docker 无法判断它们是相同的。这是浪费空间。

你可以做的是创建一个定义基础镜像的 Dockerfile:

# Base image
FROM ubuntu:latest
RUN apt-get install -y gcc

然后,你运行docker build -t my-cool-base-image .

现在,您可以像这样引用基础映像:

# Image A
FROM my-cool-base-image:latest
RUN apt-get install -y foo
# No need to install gcc here

现在您的两个容器将在磁盘上共享一个 gcc 副本。

【讨论】:

  • 这听起来是个好消息,我会检查一下。注册。 “构建缓存”:我们使用图像的版本号,所以也许这就是阻止“构建缓存”的原因。如果我没记错的话,如果图像 A 使用 x GB,则具有新版本号和另一个工具链(大小 y)的第二个图像将在“/var/lib/docker”上消耗另一个“x+y” GB。
猜你喜欢
  • 2016-03-02
  • 1970-01-01
  • 2011-02-06
  • 2013-10-21
  • 1970-01-01
  • 1970-01-01
  • 2013-06-01
  • 1970-01-01
  • 2012-10-04
相关资源
最近更新 更多