大瀧
2024.07.31
97
こんにちは、オオタキです。
この記事ではdocker-composeの操作コマンドを簡略化する「Makefile」の作成方法を解説します。
5分で作成できて日々の開発効率が上がるのでよかったら読んでいってください。
さっそくですが本題のMakefileをお見せします。
Makefile
というファイルをプロジェクトのルートディレクトリに作成し、以下の内容を記載します。
# makeを打った時のコマンド
.DEFAULT_GOAL := help
.PHONY: up down build ps api mysql help
up: ## コンテナ起動
docker-compose up
down: ## コンテナ停止
docker-compose down
build: ## コンテナビルド
docker-compose build
ps: ## コンテナのステータス確認
docker-compose ps
project-api: ## project-apiコンテナに入る
docker-compose exec -it project-api /bin/bash
mysql: ## mysqlコンテナに入る
docker-compose exec -it mysql /bin/bash
help: ## ヘルプ
@grep -E '^[a-zA-Z_-]+:.*?## .*$$' $(MAKEFILE_LIST) | \
awk 'BEGIN {FS = ":.*?## "}; {printf "\033[36m%-20s\033[0m %s\n", $$1, $$2}'
作成したらMakefileと同じ階層でmake
もしくはmake help
コマンドを実行して、ヘルプが使用可能なコマンドとそれぞれのコマンドの説明が表示されることを確認しましょう。
$ make
up コンテナ起動
down コンテナ停止
build コンテナビルド
ps コンテナのステータス確認
project-api manager-apiコンテナに入る
mysql mysqlコンテナに入る
help ヘルプ
使い方は他のコマンドと同じです。
$ make ターゲット
という形式でターミナルに入力して実行するだけで使えます。
例えば、
$ docker compose up
をしたい場合には、ターミナルに$ make up
と入力して実行します。
同様にコンテナを停止する場合は$ make down
、ビルドする場合は$ make build
で実行できます。
Makefile内の各項目について解説していきます。
コマンドラインでターゲットが指定されなかった場合に使用されるデフォルトの動作を定義します。
今回はコマンドの説明を表示するために help をデフォルトのターゲットとして設定しています。
ターゲットと同名のファイルが作成された場合にコマンドが正しく動作しなくなることを回避するために定義します。
例えば、cleanというターゲットがあるとします。
clean:
rm *.o temp
このままの状態だと、同じディレクトリ内にcleanという名前のファイルが作成された場合に、$ make clean
コマンドが正常に動作しなくなります。
このような名前の衝突を避けるため、.PHONYにcleanターゲットを記載する必要があります。
.PHONY: clean
clean:
rm *.o temp
それぞれdocker-composeのup, down, build, psコマンドを実行します。
up: がターゲット、その下の行が実際に実行するコマンドという構成です。
APIサーバー用のコンテナやmysqlコンテナに入るためのdocker-compose execコマンドを実行します。
コマンドが長いのでよく設定していますが意外と便利です。
ご自身のプロジェクトのコンテナ名に書き換えて使用してください。
<コンテナ名>:
docker-compose exec -it <コンテナ名> /bin/bash
Makefile内のターゲットと説明を出力するために設定しています。
ファイル内で## コンテナ起動
のようにシャープ2つの後に続けて説明を記載しておくと以下のように説明として出力されます。
$ make
up コンテナ起動
down コンテナ停止
build コンテナビルド
ps コンテナのステータス確認
project-api manager-apiコンテナに入る
mysql mysqlコンテナに入る
help ヘルプ
いかがでしたでしょうか。
他にもテスト用のコマンドなどを作成してみてもいいかもしれないですね。
Makefileを作成してmakeコマンドが使えるようになると開発の効率がかなり上がるので、皆さんもぜひやってみてください。
参考: