こんにちは、さるまりんです。
Dockerを使って開発していると、コマンドがだんだん長くなっていきますよね。
docker build、docker compose up -d、docker 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.yml と Makefile を少し修正します。# 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 exec と make 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 commit、make push、make deploy、こんな感じでしょうか。事故が起こりにくくわかりやすい開発をしていきたいと思います。
読んでくださってありがとうございました。
それではまた!