1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Dockerコンテナ内とローカルでMakefileの実行コマンドを切り替える方法

Last updated at Posted at 2023-12-20

VSCode Dev Containerで、Makefileの内容をコンテナ内で作業しているときと、ローカルにいるときで分けたくなりました。

prefixをつけて別コマンドとしても良いですが、同じ動作を期待するなら自分がコンテナかローカルのどちらにいるかを気にせずに、同じコマンドで動いたほうがいいですよね。

私はMakefileについてはど素人だったので、色々手探りで実装してみました。

TL;DR

ifeq (,$(wildcard /.dockerenv))
	@echo "I am not in docker"
else
	@echo "I am in docker"
endif

Makefileで条件分岐をする

基本的な構文としてifeq else endif が使えます。他のプログラミング言語とほとんど同じです。

ifeq (AAA, BBB)
    @echo "true"
else
    @echo "false"
endif

このコードではAAA=BBBのとき、trueが出力され、それ以外のときにfalseが出力されます。

プロセスがDockerコンテナで動いているかを判定する

いろいろ方法はあるらしいですが、/.dockerenv ファイルの存在確認をするのが早そうです。
ただし、Makefileでファイルの存在を確認するときは少しトリッキーな方法が必要です。

wildcardという関数があり、本来はワイルドカード*を利用し特定の拡張子を持つファイルをすべて展開するためのものです。

この関数をワイルドカードを使わず単にフルパスで用いると、ファイルが存在するときはファイル名を、なければ空文字を返しますので、ifeqで分岐に使えます。

ifeq (,$(wildcard /.dockerenv)) # /.dockerenv ファイルが存在しない場合

おまけ

ifeq (,$(wildcard /.dockerenv)) はファイルが 存在しない 場合なので、存在するときのみ処理を行いたいときは ifneq (,$(wildcard /.dockerenv)) とするとよいです。

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?