在Makefile中清空“docker images”
我有一个基本的泊坞窗命令的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)
调用makedocker
函数…不存在。 这将作为空string进行评估,即使您有docker
图像。 使用:DOCKER_IMAGES = $(shell docker images -q)
-
ifdef
不工作,你显然认为:ifdef $(DOCKER_IMAGES)
展开variables
$(DOCKER_IMAGES)
,然后testing一个名为扩展结果的variables是否有值。 不是你想要的。 你可以使用:ifdef DOCKER_IMAGES
代替。 但这不是一个好主意,因为
DOCKER_IMAGES
的值可能只是空白。 你想要的是testing如果$(DOCKER_IMAGES)
是一个空白string或不。 使用:ifneq ($(strip $(DOCKER_IMAGES)),)
请注意,
$(strip...)
非常重要,它将删除前导空格和尾随空格,以便在$(DOCKER_IMAGES)
仅包含空格时不会通过testing。
您的代码关于正在运行的容器的相同注释。