2017-07-07 55 views
0

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

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

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

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

所以我想知道是否有方法让make检测是否需要重建特定的Docker镜像。

+0

码头工需要重建的标准是什么? (如果只是时间戳比较,那么很简单,否则,您可能会在配方中创建一个脚本来有条件地重建)。您需要提供更多信息才能有效帮助您。 – blackghost

+0

这个标准可以让Docker重建一个Docker镜像层。如果没有什么可做的事,那么图像中的每一层都将从缓存中加载,而不是重建。在这种情况下,所有图层都可以从缓存中挑选出来,我希望'make'能够跳过整个docker build命令。我不确定Docker如何检测是否需要重建图层,以及是否将构建上下文发送到Docker守护程序是不可避免的。 –

+0

只是一个快速免责声明:我对码头本身一无所知。但是,话虽如此,我可以假设每个码头图像都在它自己的独立目录中,并且码头不依赖于该目录之外的任何东西吗? – blackghost

回答

1

假设:

  • 你的搬运工图像被命名为diadibdic ...
  • 各自搬运工文件被命名为dockerfile.diadockerfile.dibdockerfile.dic ...
  • 及其相应的编译目录是./dia.dir/./dib.dir/,./dic.dir/ ...
  • dia取决于o n个文件foobar./dia.dir/
  • dib取决于./dib.dir/文件cuz和泊坞窗图像dia
  • dic./dic.dir/取决于文件baz和泊坞窗图像dib

你可以尝试像(不测试):

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 [email protected] 

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) 

只有在泊坞窗文件发生更改或其目录中所依赖的文件发生更改或其所依赖的泊坞窗图像发生更改时,它才应该重建泊坞窗图像。

+0

我现在正在使用这种解决方案,至少从中得到了一些启发。奇迹般有效。谢谢! –