空“泊坞窗图片”中的Makefile
我有一个Makefile的一些基本泊坞窗命令:空“泊坞窗图片”中的Makefile
all: build
build:
docker build .
DOCKER_CONTAINERS=$(docker ps -a -q)
DOCKER_IMAGES=$(docker images -q)
clean:
ifdef $(DOCKER_CONTAINERS)
@echo "Stopping Docker containers..."
docker stop $(DOCKER_CONTAINERS)
@echo "Deleting Docker containers..."
docker rm $(DOCKER_CONTAINERS)
endif
iclean:
ifdef $(DOCKER_IMAGES)
@echo "Deleting Docker images..."
docker rmi $(DOCKER_IMAGES)
endif
,并想用最后一个清理现有的图片,我确实有一些图片:
$ docker images -q
aaa5a74f6006
099dec0df83b
c9889c81a971
bddca31db222
d85328b9bf58
dd6f76d9cc90
然而,DOCKER_IMAGES
似乎并不在规则中定义(我查了一倍,后来通过显示它):
$ make iclean
make: Nothing to be done for 'iclean'.
它正常工作与clean
:
$ make clean
Stopping Docker containers...
docker stop $(docker ps -a -q)
f33d30ddc991
35d4d9262460
9ac0507e0b7b
59ff62aa1c0a
2d623e844c23
cb013d3919f4
Deleting Docker containers...
docker rm $(docker ps -a -q)
f33d30ddc991
35d4d9262460
9ac0507e0b7b
59ff62aa1c0a
2d623e844c23
cb013d3919f4
我在做什么错在这里?
我看到两个潜在的问题:
-
$(docker images -q)
调用化妆docker
功能......不存在。这将评估为空字符串,即使您拥有docker
图像。用途:DOCKER_IMAGES = $(shell docker images -q)
-
ifdef
,你显然觉得不工作:ifdef $(DOCKER_IMAGES)
扩展变量
$(DOCKER_IMAGES)
,然后测试一个命名为扩展的结果变量的值。不是你想要的。您可以使用:ifdef DOCKER_IMAGES
改为。但这不是一个好主意,因为
DOCKER_IMAGES
的值可能只是空白。如果$(DOCKER_IMAGES)
是空白字符串,则需要进行测试。用途:ifneq ($(strip $(DOCKER_IMAGES)),)
注意,
$(strip...)
是很重要的,它消除了开头和结尾的空白使得测试没有通过,如果$(DOCKER_IMAGES)
只有空白。
您的关于正在运行的容器的代码的相同备注。
应用这两个修复程序解决了这个问题,谢谢!但是,你知道为什么它使用'clean'而不是'iclean'吗?他们显然是一样的... – 3kt
@ 3kt老实说,我不知道为什么它使用'干净'。唯一的可能性是make变量'DOCKER_CONTAINERS'的值是另一个现有的make变量的名称。我不明白'DOCKER_CONTAINERS = $(docker ps -a -q)'可以做到这一点。 –
你有一个名为'iclean'的文件吗?无论如何,您应该将您的目标定义为[PHONY](https://www.gnu.org/software/make/manual/html_node/Phony-Targets.html)。 – kichik