我有6个不同的Dockerfile,它们看起来非常相似,所以我使用m4并包括从代码片段构建它们。
除了C++之外,我对使用Makefile的其他用途不太了解,而且当m4文件更改时,make不进行重建,以及除非目标更改,否则不会运行迭代复制操作。
请提供一些关于更好的实践和帮助的投入?
请参阅:https://github.com/ptr727/NxWitness/tree/master/Make
.DEFAULT_GOAL := check
# Even if the m4 files changed make still reports up to date?
INPUTS = $(wildcard ${CURDIR}/*.m4)
OUTPUTS = $(addsuffix .dockerfile, $(basename $(INPUTS)))
# Why does the output look funky?
TARGETS = $(abspath ${CURDIR}/..)/$(basename $(notdir $(INPUTS)))/Dockerfile
%.dockerfile : %.m4
m4 $< > $@
check:
@echo "INPUTS = $(INPUTS)"
@echo "OUTPUTS = $(OUTPUTS)"
@echo "TARGETS = $(TARGETS)"
create: $(OUTPUTS)
clean:
-rm *.dockerfile $(OUTPUTS)
# Why does make report up to date even after clean?
# $(foreach file, $(OUTPUTS), $(cp $(file) $(abspath ${CURDIR}/..)/$(basename $(notdir $(file)))/Dockerfile))
replace:
cp DWSpectrum.dockerfile ../DWSpectrum/Dockerfile
cp DWSpectrum-LSIO.dockerfile ../DWSpectrum-LSIO/Dockerfile
cp NxWitness.dockerfile ../NxWitness/Dockerfile
cp NxWitness-LSIO.dockerfile ../NxWitness-LSIO/Dockerfile
cp NxMeta.dockerfile ../NxMeta/Dockerfile
cp NxMeta-LSIO.dockerfile ../NxMeta-LSIO/Dockerfile
build:
docker build -f ../DWSpectrum/Dockerfile ../DWSpectrum
docker build -f ../DWSpectrum-LSIO/Dockerfile ../DWSpectrum-LSIO
docker build -f ../NxWitness/Dockerfile ../NxWitness
docker build -f ../NxWitness-LSIO/Dockerfile ../NxWitness-LSIO
docker build -f ../NxMeta/Dockerfile ../NxMeta
docker build -f ../NxMeta-LSIO/Dockerfile ../NxMeta-LSIO发布于 2020-06-06 17:26:08
在您的Dockerfile中,有一些与实际文件不相对应的目标,如build和replace。这些都会被认为是过时的,需要重建,即使它们的投入没有改变。(在GNU中,将它们标记为.PHONY:是一个很好的实践。)
如果您有一些任务,比如构建一个Docker映像,而它本身并不直接生成一个文件,那么一种有用的技术就是放置某种“标记”文件来记录它已经完成了。完成任务后,touch标记文件。如果其中一个输入已更改,则它将显示比标记文件更新的内容,并将导致Docker重新生成该文件。
%/.docker-build: %/Dockerfile
docker build $(dir $@)
touch "$@"您可以使用类似的模式语法从m4文件生成Dockerfile。(这几乎正是上面的规则,但目标不同。)
%/Dockerfile: %.m4
m4 $< >$@如果您有一个目录列表
DIRS := DWSpectrum DWSpectrum-LSIO NxWitness NxWitness-LSIO NxMeta NxMeta-LSIO然后,您就可以让"build“目标依赖于标记文件。
.PHONY: build
build: $(DIRS:%=%/.docker-build)“清洁”规则应该清理我们所产生的一切
.PHONY: clean
clean:
rm -f $(DIRS:%=%/.docker-build)
rm -f $(DIRS:%=%/Dockerfile)这里我使用了两个语法来替换函数调用和foreach循环。在构建规则时,如果%位于规则的两边,则可以用相同的字符串替换它以生成模式规则;make知道可以通过该规则从DWSpectrum/Dockerfile构建DWSpectrum/.docker-build。$(DIRS:%=%/Dockerfile)是一个替代参考;对于与模式% (即每个项)匹配的$(DIRS)中的每个项,用匹配的字符串加上/Dockerfile后缀替换它。
https://stackoverflow.com/questions/62235080
复制相似问题