空"码头图像"在Makefile中

时间:2017-11-11 02:03:59

标签: docker makefile

我有一个带有一些基本docker命令的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 个答案:

答案 0 :(得分:3)

我发现了两个潜在的问题:

  1. $(docker images -q)调用make docker函数...不存在。即使您有docker个图像,也会将其评估为空字符串。使用:

    DOCKER_IMAGES = $(shell docker images -q)
    
  2. ifdef无效,因为您显然认为:

    ifdef $(DOCKER_IMAGES)
    

    展开变量$(DOCKER_IMAGES),然后测试名为扩展结果的变量是否具有值。不是你想要的。你可以使用:

    ifdef DOCKER_IMAGES
    

    代替。但这不是一个好主意,因为DOCKER_IMAGES可能有一个空白的值。你想要的是测试$(DOCKER_IMAGES)是否为空字符串。使用:

    ifneq ($(strip $(DOCKER_IMAGES)),)
    

    请注意,$(strip...)很重要,它会删除前导和尾随空白,以便在$(DOCKER_IMAGES)仅包含空格时测试无法通过。

  3. 关于正在运行的容器的代码的相同备注。