Makefileでdockerのイメージやコンテナをあれこれしたいという事情があって(これです)、その際に躓いたのでメモしておきます。

指定の名称のdocker コンテナがあるかどうかで処理を分ける、ということをしたかったので、以下のような感じでMakefileにターゲットを作成しました

test_container_exist:
	if [ $(docker ps -qa -f name=${NAME}) ]; then \
		echo container $(NAME) is exist. ; \
	else \
		echo contaier $(NAME) is not exist. ; \
	fi

実際に動かしてみると、条件として設定してあるdockerコマンドの実行結果が空っぽになってしまい( if [ ]; then になっている )、コンテナの有無にかかわらず常にelseのほうが実行されてしまうのでした。

コマンドラインから上記のdocker コマンドを実行すると、ちゃんと指定の名称のコンテナIDが返ってくるのですが…

いろいろ調べていたところ、どうやらMakefileの中でコマンドを実行するには $(shell command)とする必要があるとわかりました。

test_container_exist:
	# docker コマンドの前に、"shell" と付記する
	if [ $(shell docker ps -qa -f name=${NAME}) ]; then \
		echo container $(NAME) is exist. ; \
	else \
		echo contaier $(NAME) is not exist. ; \
	fi

できましたできました。こんなことに小一時間もかけてしまった…?

RTFMな事案でした。ちゃんとドキュメントに目を通すようにしたいです。

あなたのお役に立てれば幸いです。