在我的一个项目中,我有几个基于彼此的Docker镜像,因为我不需要每次都重建它的基本部分,只是想逐步构建层次结构的上层。
我通过Makefile构建图像。我这样做是因为我确实很懒,并且不想每次都手动输入整个docker build
命令。而且因为我想避免在这个过程中犯错误。
我现在要做的是让make
能够检测Docker镜像是否必须重建而不是Docker本身,因为后者必须每次都将Docker构建上下文发送到Docker守护进程。图像非常大,因为它基于ubuntu:xenial,因此“向Docker守护程序发送构建上下文”总是需要花费大量时间来处理每个Docker镜像,而不管它们是否需要重建。
如果make
能够检测是否需要执行docker build
命令,这将有助于加快进程。
所以我想知道make
是否有办法检测是否需要重建特定的Docker镜像。
答案 0 :(得分:1)
假设:
dia
,dib
,dic
... dockerfile.dia
,dockerfile.dib
,dockerfile.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 dockerfiles
和make
文件,使用非常方便。