由于缺少工件,防止在Make中执行不必要的执行

时间:2018-02-08 21:05:54

标签: docker makefile

我尝试使用make在Docker容器中构建,运行和部署我的python代码。这些命令很简单,但是我很难让它们像Makefile一样工作。

我已经为docker_build定义了一条规则,如下所示:

docker_build: Dockerfile requirements.txt *.py
    docker build -t $(IMAGE_NAME) .

任何时候我的Dockerfile,requirements.txt或任何python文件发生变化,我都需要构建一个新的图像。一旦构建,我不想执行命令,直到依赖项发生变化。但是,因为我没有现成的工件,所以docker_build步骤总是会执行。

如何防止不必要的构建?我知道我可以触摸一个名为“docker_build”的文件,但是我需要为每一步执行此操作,它会创建一堆我真正不想要的文件。我想我可以将它们添加到.gitignore,并将它们添加到我的清理目标中,但这感觉很脏。必须有更好的方法。

1 个答案:

答案 0 :(得分:1)

您需要一个虚拟工件来跟踪上次构建的时间:

docker_build: .docker_build
.PHONY: docker_build

.docker_build: Dockerfile requirements.txt *.py
    docker build -t $(IMAGE_NAME) .
    touch $@

.docker_build的时间戳用作重建的触发器。别忘了清理它。

---编辑---

抱歉,我只是重读你最后一段你基本描述的内容,然后说你不喜欢它。首先,如果您没有可靠的时间戳,这种做法并不罕见。基本上你必须将最后的构建时间存储在某个地方,这意味着你需要一种文件。通常文件名前缀为.以避免弄乱ls等。但是,是的,它是一个工件,必须通过修订控件清理和忽略(您也可以将它放在对象目录中,如果这让你感觉更好)。