带有Docker Compose的Makefile,如何防止每次生成?

问题描述 投票:0回答:1

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

.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命令。是否可以仅在需要时运行构建?我想知道最好的做法,谢谢:)

docker makefile docker-compose
1个回答
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更新,因此无需执行任何操作,并且会跳过图像构建。

© www.soinside.com 2019 - 2024. All rights reserved.