我可能用错了术语,所以请随时纠正我。我们一段时间以来一直在滥用 make 进行大量构建。99% 的时间都是使用虚假目标。我们有 docker build 项目,我们为每个版本化的 docker 文件调用 docker build。文件结构看起来像这样:
6/Dockerfile
8/Dockerfile
获取项目中的 docker 文件列表很容易。
DOCKERFILES:=$(wildcard */Dockerfile)
目前我们正在使用这种方法来构建docker文件:
.PHONY: all
all: lint init build-images
.PHONY: lint
lint:
$(foreach image, $(DOCKERFILES),$(call dockerLint,$(image),$(_DOCKER_BUILD_ARCH)))
.PHONY: init
init:
$(foreach image, $(DOCKERFILES),$(call initVariablesForImage,$(image)))
.PHONY: build-images
build-images:
$(foreach image, $(DOCKERFILES),$(call dockerBuildPush,$(image),$(_DOCKER_BUILD_ARCH)))
但是,为了更好地理解 make 并避免 foreach,是否可以定义与 Dockerfile 匹配的多个规则并运行相关配方?我使用单个规则取得了一些成功,但一旦我尝试执行多个配方,它就会失败。
.PHONY: test
test: $(DOCKERFILES)
$(DOCKERFILES):*
$(info ***** build $@)
输出结果如下:
***** build 6/Dockerfile
***** build 8/Dockerfile
我预计这种方法是错误的,因为当我尝试引入其他目标时,我会收到覆盖警告或循环引用:
warning: overriding commands for target `8/Dockerfile'
warning: ignoring old commands for target `8/Dockerfile'
...
make: Circular 6/Dockerfile <- 6/Dockerfile dependency dropped.
make: Circular 7/Dockerfile <- 7/Dockerfile dependency dropped.
make: Circular 8/Dockerfile <- 8/Dockerfile dependency dropped.
我想停下来看看我想要实现的目标是否可行。我们现有的方案是可行的,但探索替代方案以查看我们能否提出更清晰的实现方案会更好。