Makefile - そのようなファイルまたはディレクトリはありませんというエラー

Makefile - そのようなファイルまたはディレクトリはありませんというエラー

まず Docker コンテナが存在するかどうかを確認する Makefile ターゲットを作成しようとしています。存在する場合は Docker Container Restart コマンドを発行し、存在しない場合は Docker Run コマンドを発行してコンテナを作成して起動します。

以下のようにコーディングしましたが、以下のエラーが発生します。コンテナが実行中なので、結果 = 1 は正しいです。コンテナを削除して、結果が 0 になることをテストしましたが、これも正しいです。問題は、ステートメントで result を使用しようとしたときに発生するようですifeq。何が間違っているのか、どなたかアドバイスをいただけませんか? (デバッグ中は、docker コマンドを一時的にコメント アウトし、echo true / false に置き換えました)。

start_docker_myapp:
    result = $(shell (docker ps -a | grep myapp ) | wc -l )
    ifeq (${result}, 1)
        @echo 'true'
# docker restart ${IMAGE}
    else
        @echo 'false'
# docker run -v ${DIR}/var/log/docker:/var/log/myapp -p 1812:1812/udp  -p 1813:1813/udp --detach  --name ${IMAGE} $(REGISTRY)/$(IMAGE):$(TAG)
    endif

ターミナルからの出力

$ make start_docker_myapp
result =        1
make: result: No such file or directory
make: *** [start_docker_myapp] Error 1
$

答え1

Makefile には、(Makefile が適切な解決策であるかどうかという問題以外にも) いくつかの問題があります。

  • 条件付きディレクティブはレシピの一部ではないため、タブで始まってはなりません。
  • 条件付きディレクティブは Makefile が読み込まれるときに評価されるため、変数は事前に割り当てる必要があり、ターゲット固有にすることはできません。
  • docker ps -a実行されていないコンテナを含むすべての既知のコンテナに関する情報を返します。
  • 偽のターゲットは偽のターゲットとして宣言する必要があります。

以下の作品:

result = $(shell docker ps -f name=myapp -q | wc -l)
start_docker_myapp:
ifeq ($(strip $(result)),1)
    @echo true
else
    @echo false
endif

.PHONY: start_docker_myapp

答え2

ターゲット内で変数値を設定するには、次のeval構文を使用する必要があります。

start_docker_myapp:
    $(eval result = $(shell (docker ps -a | grep myapp ) | wc -l ))
    @echo "result is " result
    endif

あるいは、ルールの外でこの変数を評価することもできます。

result = $(shell (docker ps -a | grep myapp ) | wc -l )

start_docker_myapp:        
    @echo "result is " result
    endif

答え3

シェル スクリプト コードと make 変数を組み合わせて実装する代わりに、これを に統合された純粋なシェル スクリプトとして実装することをお勧めしますMakefile

grepの出力をチェックしwcて数値を比較する代わりに、単にgrepの終了コードをチェックすることができます。

# don't forget to declare start_docker_myapp as a phony target
.PHONY: start_docker_myapp

# Assuming you intended to use Make variables everywhere, I changed all ${VAR} to $(VAR).
# If your grep supports option -q you can use this instead of redirection to /dev/null.

start_docker_myapp:
    if docker ps -a | grep myapp >/dev/null; \
    then \
        echo 'true'; \
        # docker restart $(IMAGE); \
    else \
        echo 'false'; \
        # docker run -v $(DIR)/var/log/docker:/var/log/myapp -p 1812:1812/udp  -p 1813:1813/udp --detach  --name $(IMAGE) $(REGISTRY)/$(IMAGE):$(TAG); \
    fi

またはブール演算子の代わりにif...then...

.PHONY: start_docker_myapp

start_docker_myapp:
    docker ps -a | grep myapp >/dev/null && docker restart $(IMAGE) || docker run -v $(DIR)/var/log/docker:/var/log/myapp -p 1812:1812/udp  -p 1813:1813/udp --detach  --name $(IMAGE) $(REGISTRY)/$(IMAGE):$(TAG)

関連情報