使用Makefile逐步构buildDocker图像层次结构

在我的一个项目中,我有几个基于对方的Docker镜像,因为我不需要每次重build它的基本部分,只是想增量构build层次结构的上层。

我通过Makefile创build图像。 我这样做,因为我承认偷懒,不想每次都手动input整个docker build命令。 也因为我想避免在这个过程中犯错误。

我现在想要做的是让make能够检测一个Docker镜像是否需要重build而不是Docker本身,因为对于后者,Docker构build上下文必须每次都发送到Docker守护进程。 这个映像是相当大的,因为它基于ubuntu:xenial,所以“向Docker守护进程发送构build上下文”总是需要大量的时间用于每个Docker镜像,而不pipe它们是否需要重build。

如果make能够检测docker build命令是否需要执行,这将有助于加速进程。

所以我想知道是否有一种方法可以检测是否需要重build特定的Docker镜像。

假设:

  • 您的docker图像被命名为diadibdic
  • 他们各自的docker文件被命名为dockerfile.diadockerfile.dibdockerfile.dic
  • 他们相应的生成目录是./dic.dir/
  • dia取决于文件foobar ./dia.dir/
  • dib取决于./dib.dir/文件cuz./dib.dir/镜像dia
  • dic依赖于./dic.dir/文件baz./dic.dir/镜像dib

你可以尝试像(未testing):

 DOCKERIMAGES := dia dib dic TAGS := $(patsubst %,.%.tag,$(DOCKERIMAGES)) diaDEPS := foo bar dibDEPS := cuz dicDEPS := baz all: $(TAGS) $(TAGS): .%.tag: dockerfile.% docker build -f $< -t $* $*.dir && \ echo '$* image built' && \ touch $@ define DEPS_rule .$(1).tag: $$(addprefix $(1).dir/,$$($(1)DEPS)) endef $(foreach d,$(DOCKERIMAGES),$(eval $(call DEPS_rule,$(d)))) .dib.tag: .dia.tag .dic.tag: .dib.tag clean: rm -f $(TAGS) 

它应该只在docker文件改变时重builddocker镜像,或者改变它们目录中依赖的文件或者依赖docker镜像的文件。