我有一个用于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
命令。是否可以仅在需要时运行构建?我想知道最好的做法,谢谢:)
此行为是将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.yml
,Dockerfile
和app
更新,因此无需执行任何操作,并且会跳过图像构建。