使用Makefile逐步构建Docker镜像层次结构

时间:2017-07-07 11:26:28

标签: docker makefile

在我的一个项目中,我有几个基于彼此的Docker镜像,因为我不需要每次都重建它的基本部分,只是想逐步构建层次结构的上层。

我通过Makefile构建图像。我这样做是因为我确实很懒,并且不想每次都手动输入整个docker build命令。而且因为我想避免在这个过程中犯错误。

我现在要做的是让make能够检测Docker镜像是否必须重建而不是Docker本身,因为后者必须每次都将Docker构建上下文发送到Docker守护进程。图像非常大,因为它基于ubuntu:xenial,因此“向Docker守护程序发送构建上下文”总是需要花费大量时间来处理每个Docker镜像,而不管它们是否需要重建。

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

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

2 个答案:

答案 0 :(得分:1)

假设:

  • 您的泊坞窗图片名为diadibdic ...
  • 他们各自的泊坞窗文件名为dockerfile.diadockerfile.dibdockerfile.dic ...
  • 其对应的构建目录为./dia.dir/./dib.dir/./dic.dir/ ...
  • dia取决于foo
  • 中的文件bar./dia.dir/
  • dib取决于cuz中的文件./dib.dir/和泊坞窗图片dia
  • dic取决于baz中的文件./dic.dir/和泊坞窗图片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 $@

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文件发生变化,或者它们在目录中依赖的文件发生变化,或者它们所依赖的docker图像发生变化时,才应重建docker镜像。

答案 1 :(得分:0)

您可以尝试使用一个名为docker-bakery的小工具来分析dockerfiles的结构,并在父图像更改时启用分层构建。

例如,当dog图像更改时,子图像可以自动重建。

├── alpine-java
│   ├── bird
│   └── mammal
│       ├── cat
│       ├── dog
│       │   ├── dobermann
│       │   │   └── smaller-dobermann
│       │   ├── pitbull
│       │   └── labrador
│       └── horse
└── scratch
    └── fish

dog重建时的调用可以简单如下:

$/docker-bakery-example> cd dog
$/dog> make build-major-all
...
// docker build of child images
... 
$/dog> make push-major-all

以下是example project dockerfilesmake文件,使用非常方便。