带有Docker Compose的Makefile,如何防止每次构建?

时间:2019-11-28 11:31:53

标签: docker makefile docker-compose

我有一个Makefile用于Docker Compose堆栈:

.PHONY: build

docker-compose.yml:
    cp docker-compose.yml.dist docker-compose.yml

build: docker-compose.yml
    docker-compose -p xxx build

但是每次我启动make build时都会执行docker-compose -p xxx build命令。是否可以仅在需要时运行构建?我想知道最好的做法,谢谢:)

1 个答案:

答案 0 :(得分:0)

此行为是将build目标声明为phony的直接结果。

docker build及其周围的包装的特定情况下,如果图像中的任何内容都没有变化,则它应该运行得非常快。 (它比重新运行make贵一点;只有在目录树很大的情况下,它才会变慢。)一种选择是忽略它并始终重建内容。

您将在Makefiles中看到的另一种常见模式是使用人工文件来跟踪构建管线序列中的特定步骤是否已经发生。您需要非常好地声明 all 所有依赖项,以使其正常工作。

.PHONY: build clean

build: .build.docker

.build.docker: docker-compose.yml Dockerfile app
        docker-compose -f $< build
        touch $@

docker-compose.yml: docker-compose.yml.dist
        cp $< $@

app: $(SOURCES:%=%.o)
        $(CC) -o $@ $(SOURCES:%=%.o) $(LIBS)

clean:
        rm -f .build.docker docker-compose.yml app

说您更改了docker-compose.yml.dist文件。使用此Makefile,它将触发将规则cp docker-compose.yml的规则,然后是重建图像的规则,然后它将更新.build.docker文件的时间戳。同样,如果更新组成应用程序的任何源文件,最终将需要重新构建Docker映像。

但是,说您没有改变任何这些东西。 build是伪造的,因此始终被认为是过时的,但它本身没有规则。它检查.build.docker文件的时间戳。由于该版本比docker-compose.ymlDockerfileapp更新,因此无需执行任何操作,并且会跳过图像构建。