将docker与多个交叉构建工具链一起使用

将docker与多个交叉构建工具链一起使用,docker,cross-compiling,toolchain,Docker,Cross Compiling,Toolchain,在我的团队中,我们目前使用单个docker映像来交叉构建软件库,在一个docker映像(/opt/…)中添加多个交叉构建工具链。Dockerfile和工具链都在一个git存储库中(通过git lfs进行工具链归档) Dockerfile便于对构建环境进行全面的形式化描述,可以在不同的机器上使用 现在,我们不断从客户那里获得工具链,有时还会获得这些工具链的新版本。 因此,我们的docker映像正在快速增长,目前使用大约40GB。更糟糕的是,如果我们需要添加/修改/删除工具链,则构建新docker映

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

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

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

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

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

我很乐意听到任何关于如何更好地完成这项工作的提示

  • 有没有“既定”的方法来处理这种情况
  • 其他团队如何处理这个用例
层 为每个工具链使用单独的docker映像将节省每次构建巨大的单个docker映像的时间。但说到空间,情况更糟(因为每个docker映像都包含带有构建工具的Linux子系统等)

这大部分是不正确的,因为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
这里我们有两个映像,它们都安装了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副本。

如果您的工具链大小为GB,则基本Linux发行版几乎是免费的;另外,如果你从ubuntu:18.04构建了多个图像,并将它们一起构建,它们将共享一个基本图像副本。这听起来是个好消息,我会检查一下。规则。“构建缓存”:我们使用图像的版本号,所以这可能就是阻止“构建缓存”的原因。如果我没记错的话,如果图像A使用x GB,那么第二个具有新版本号和另一个工具链(大小为y)的图像将在“/var/lib/docker”上使用另一个“x+y”GB。
# Image A
FROM my-cool-base-image:latest
RUN apt-get install -y foo
# No need to install gcc here