2017-11-11 4 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

私は2つの潜在的な問題を参照してください。

  1. $(docker images -q)はメイクdocker機能...存在しません起動します。 dockerの画像を持っていても、これは空の文字列として評価されます。用途:

    ifdef $(DOCKER_IMAGES) 
    

    は、変数$(DOCKER_IMAGES)を拡大し、拡大の結果としてという名前の変数が値を持っているならば、テストします。あなたは明らかだと思うよう

    DOCKER_IMAGES = $(shell docker images -q) 
    
  2. ifdefは動作しません。あなたが望むものではありません。代わりに、

    ifdef DOCKER_IMAGES 
    

    を使用できます。 DOCKER_IMAGESは値が空白になる可能性があるので、それはあまり良い考えではありません。あなたが欲しいのは、$(DOCKER_IMAGES)が空文字列かどうかのテストです。用途:$(strip...)が重要であることを

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

    は注意、それは$(DOCKER_IMAGES)は空白のみが含まれている場合、テストに合格しないように先頭と末尾の空白を削除します。

実行中のコンテナについてのコードと同じです。

+0

両方の修正プログラムを適用すると、問題は解決します。しかし、なぜそれが 'きれいな'と一緒に働くのか、 'iclean'と一緒に働かないのか知っていますか?彼らは賢明に同じです... – 3kt

+0

@ 3kt正直なところ、私はそれがなぜ「きれい」で働いたのか分かりません。唯一の可能性は、make変数 'DOCKER_CONTAINERS'の値が別の既存のmake変数の名前であることです。そして、私は 'DOCKER_CONTAINERS = $(docker ps -a -q)'がどのようにこれを行うことができるのか分かりません。 –

関連する問題