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