2017-11-11 138 views
0

我有一個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 

我在做什麼錯在這裏?

+0

你有一個名爲'iclean'的文件嗎?無論如何,您應該將您的目標定義爲[PHONY](https://www.gnu.org/software/make/manual/html_node/Phony-Targets.html)。 – kichik

回答

1

我看到兩個潛在的問題:

  1. $(docker images -q)調用化妝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)只有空白。

您的關於正在運行的容器的代碼的相同備註。

+0

應用這兩個修復程序解決了這個問題,謝謝!但是,你知道爲什麼它使用'clean'而不是'iclean'嗎?他們顯然是一樣的... – 3kt

+0

@ 3kt老實說,我不知道爲什麼它使用'乾淨'。唯一的可能性是make變量'DOCKER_CONTAINERS'的值是另一個現有的make變量的名稱。我不明白'DOCKER_CONTAINERS = $(docker ps -a -q)'可以做到這一點。 –