使用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图像被命名为
dia
,dib
,dic
… - 他们各自的docker文件被命名为
dockerfile.dia
,dockerfile.dib
,dockerfile.dic
… - 他们相应的生成目录是
./dic.dir/
… -
dia
取决于文件foo
,bar
./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镜像的文件。