もう長いコマンドはいらない!makeでDocker操作をスマートに

こんにちは、さるまりんです。
Dockerを使って開発していると、コマンドがだんだん長くなっていきますよね。
docker builddocker compose up -ddocker exec -it ...
覚えられないし、毎回打つのはちょっと面倒。(もちろん、手で覚えるのも大事なんですけどね。)
そこで今回は、MakefileでDocker操作を自動化してみます。
make build」「make up」だけで環境を起動できるようにするのが目標です!

Step 1:準備するファイル

まずは最小構成でDocker環境を用意します。
下記のような構成をローカルでやってみます。
project/
├── docker-compose.yml
├── Makefile
└── app/
    └── hello.sh

app/hello.sh

#!/bin/bash
echo "Hello from salumarine on docker container!"

docker-compose.yml

services:
  app:
    image: ubuntu:22.04
    container_name: hello-app
    volumes:
      - ./app:/app
    working_dir: /app
    command: ["bash", "hello.sh"]
これで docker compose up を実行すると、ターミナルに Hello from salumarine on docker container! が出ます。

Step 2:Makefileでコマンドを短縮!

Makefile

# 基本コマンド
build:
	docker compose build

up:
	docker compose up -d

down:
	docker compose down

logs:
	docker compose logs -f
使い方はとっても簡単です👇
make build
make up
make logs
make down
長くなりがちなDockerコマンドも、こうしておくとスッキリ使えますね。
docker compose ...」を毎回入力するより、はるかにラクです。

Step 3:実行の仕方を選ぼう(2通り)

ここまでの構成では、コンテナは一度動いてすぐ終了していました。
コンテナの中に入って作業ということもよくあると思うので、そちらも試してみたいと思います。

A. ワンショットモード:一度動いて即終了!

一回だけスクリプトを実行して終わる方式です。
# docker-compose.yml
services:
  app:
    image: ubuntu:22.04
    container_name: hello-app
    working_dir: /app
    volumes:
      - ./app:/app
    command: ["bash", "hello.sh"]  # 起動時に実行して終了
実行するとすぐメッセージが表示されます。
$ docker compose up
[+] Running 2/2
 ✔ Network test-proj_default  Created
 ✔ Container hello-app        Created
Attaching to hello-app
hello-app  | Hello from salumarine on docker container!
hello-app exited with code 0
これが最もシンプルな「成果確認」モード。
ただし、コンテナはすぐ終了するので make exec で中に入ることはできません。

B. 常駐モード:中に入って作業したいとき

開発中によく使うのはこちら。
コンテナを立ち上げっぱなしにして、必要な時にコマンドを実行します。
そのために、docker-compose.ymlMakefile を少し修正します。
# docker-compose.yml
services:
  app:
    image: ubuntu:22.04
    container_name: hello-app
    working_dir: /app
    volumes:
      - ./app:/app
    tty: true
    stdin_open: true
    command: ["bash", "-lc", "tail -f /dev/null"]  # 常駐させる
そして Makefile にコマンドを追加します。
exec:
	docker compose exec app bash

hello:
	docker compose exec app bash -lc 'bash hello.sh'
これで動作確認。
make up      # 常駐コンテナを起動
make exec    # コンテナの中に入る
make hello   # 外からスクリプトを実行
make up で立ち上げてから、make execmake hello を実行するとこうなります。
% make exec
docker compose exec app bash
root@1f7364325421:/app# exit
exit
% make hello
docker compose exec app bash -lc 'bash hello.sh'
Hello from salumarine on docker container!
すぐ終わるモードと常駐モード、どちらも使う機会があるので、用途で使い分けですね。

Step 4:環境を切り替える応用

環境別で動作が変わる……これも開発では“あるある”ですよね。
Makefileに変数を渡して環境を切り替えることもできます。
ENV_FILE ?= .env.dev

up:
	docker compose --env-file $(ENV_FILE) up -d
以下のようにenvファイルを指定できます。
make ENV_FILE=.env.stg up
.env の内容を切り替えられるので、開発・ステージング環境を分けたいときに便利です。

Step 5:片付けもワンコマンドで

clean:
	docker compose down --volumes --remove-orphans

これで不要なボリュームも一掃できます。

make clean

実行してみたらこんな感じになりました。

% make clean
docker compose down --volumes --remove-orphans
[+] Running 2/2
 ✔ Container hello-app        Removed                                      1.2s 
 ✔ Network test-proj_default  Removed                                      0.2s

🐒 まとめ

Makefileを使えば、Docker操作をもっと簡単にして、チーム共通の“入り口にできます。
どのマシンでも、どの人でも、同じコマンド体系で動かせる。
make up」「make down」だけで開発が始まるって、気持ちいいですよね。
makeで「git操作を自動化」するのも便利そう。
make commitmake pushmake deploy、こんな感じでしょうか。
事故が起こりにくくわかりやすい開発をしていきたいと思います。
読んでくださってありがとうございました。
それではまた!