首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用m4构建Dockerfile的Makefile并不是重新生成

使用m4构建Dockerfile的Makefile并不是重新生成
EN

Stack Overflow用户
提问于 2020-06-06 16:59:47
回答 1查看 279关注 0票数 0

我有6个不同的Dockerfile,它们看起来非常相似,所以我使用m4并包括从代码片段构建它们。

除了C++之外,我对使用Makefile的其他用途不太了解,而且当m4文件更改时,make不进行重建,以及除非目标更改,否则不会运行迭代复制操作。

请提供一些关于更好的实践和帮助的投入?

请参阅:https://github.com/ptr727/NxWitness/tree/master/Make

代码语言:javascript
复制
.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
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-06-06 17:26:08

在您的Dockerfile中,有一些与实际文件不相对应的目标,如buildreplace。这些都会被认为是过时的,需要重建,即使它们的投入没有改变。(在GNU中,将它们标记为.PHONY:是一个很好的实践。)

如果您有一些任务,比如构建一个Docker映像,而它本身并不直接生成一个文件,那么一种有用的技术就是放置某种“标记”文件来记录它已经完成了。完成任务后,touch标记文件。如果其中一个输入已更改,则它将显示比标记文件更新的内容,并将导致Docker重新生成该文件。

代码语言:javascript
复制
%/.docker-build: %/Dockerfile
        docker build $(dir $@)
        touch "$@"

您可以使用类似的模式语法从m4文件生成Dockerfile。(这几乎正是上面的规则,但目标不同。)

代码语言:javascript
复制
%/Dockerfile: %.m4
        m4 $< >$@

如果您有一个目录列表

代码语言:javascript
复制
DIRS := DWSpectrum DWSpectrum-LSIO NxWitness NxWitness-LSIO NxMeta NxMeta-LSIO

然后,您就可以让"build“目标依赖于标记文件。

代码语言:javascript
复制
.PHONY: build
build: $(DIRS:%=%/.docker-build)

“清洁”规则应该清理我们所产生的一切

代码语言:javascript
复制
.PHONY: clean
clean:
        rm -f $(DIRS:%=%/.docker-build)
        rm -f $(DIRS:%=%/Dockerfile)

这里我使用了两个语法来替换函数调用和foreach循环。在构建规则时,如果%位于规则的两边,则可以用相同的字符串替换它以生成模式规则;make知道可以通过该规则从DWSpectrum/Dockerfile构建DWSpectrum/.docker-build$(DIRS:%=%/Dockerfile)是一个替代参考;对于与模式% (即每个项)匹配的$(DIRS)中的每个项,用匹配的字符串加上/Dockerfile后缀替换它。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62235080

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档