Docker组成的级联构建映像

时间:2020-01-13 09:51:19

标签: docker docker-compose

我想构建一组图像,一个图像取决于另一个。 例如,我想创建图像A,其中包含源代码和SDK,并执行构建。 然后,我想创建映像B,其中包含运行时和从机器A检索到的一些二进制文件,以运行Web应用程序的用户前端。 最后,我想创建映像C,其中包含运行时和从(从)机器A再次检索到的一些二进制文件中,以运行Web应用程序的管理命令。

总结一下,这就是我想要做的:

  • 创建机器A;将源文件从主机复制到计算机A,执行构建
  • 创建机器B;将文件(二进制文件)从机器A复制到机器B
  • 创建机器C;将文件(二进制文件)从机器A复制到机器C
  • 扔掉机器A
  • 运行机器B
  • 运行计算机C

在这种情况下,我应该能够从dockerfile创建机器A并为其指定名称和标签;接下来,我需要从其他dockerfiles中引用它。

我试图在docker-compose文件中指定镜像名称和标签: 图片:myRepo / imageA:Images.A

仅我无法从dockerfiles B和C中检索到它。我是否有必要构建回购计算机并将计算机A存储在其上?可以避免这一步吗?

1 个答案:

答案 0 :(得分:1)

您描述的布局是合理的,但不能直接表达给Docker Compose。 (它没有任何方法可以表达未附加到正在运行的容器上的图像,也不能表达不同图像版本之间的依赖关系。)您需要在需要时手动重建基本图像

docker build -f Dockerfile.sdk -t image-a .

您的其他Dockerfile可以以

开头
FROM image-a

无需特别将此图像推送到存储库,只要您已正确构建并标记该图像并且该图像在本地存在,就可以启动另一个Dockerfile FROM图像。

然后您可以正常使用docker-compose up --build

您可以“教” Docker Compose,但这只能通过添加您实际上并不希望运行的附加服务来实现。

services:
  a:
    build:
      context: .
      dockerfile: Dockerfile.sdk
    image: image-a
    command: /bin/true  # exit immediately

docker-compose build documentation对内置的订单容器不做任何声明(甚至保证可以串行构建),因此再次需要手动构建

docker-compose build a
docker-compose up --build

是否需要单独的“应用程序”和“工具”图像也值得考虑。我的直觉是,在大多数图像中,基本图像和语言运行时的大小都比应用程序的大小大得多,尤其是进入应用程序的单个入口点。如果单个图像带有几个额外的小工具命令可以满足您的需求,那么您所描述的就是multi-stage build的非常典型的用法。要运行工具命令,您可以使用替代命令docker-compose run docker-compose.yml文件中声明的一项服务,或specify both a build: and a target image: name in docker-compose.ymldocker run生成的图像。

相关问题