在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 

我在这里做错了什么?

我看到两个潜在的问题:

  1. $(docker images -q)调用make docker函数…不存在。 这将作为空string进行评估,即使您有docker图像。 使用:

     DOCKER_IMAGES = $(shell docker images -q) 
  2. 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。

您的代码关于正在运行的容器的相同注释。