こんにちは。よっしーです(^^)
今日は、dockerで構築した開発環境において、makeコマンドを導入する手順をご紹介します。
実行環境
この記事では、下記の記事で構築している開発環境を前提にしていますので、環境構築をされていない方は、記事を参考に環境構築をお願いします。
makeコマンドの導入
この記事で使用しているmakeコマンドのバージョンは下記になります。
% make --version
GNU Make 3.81
Copyright (C) 2006 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.
There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A
PARTICULAR PURPOSE.
This program built for i386-apple-darwin11.3.0
ディレクトリ構造
ディレクトリ構造は下記のようになっています。赤字の箇所が新規&更新になります。
.
├── LICENSE
├── Makefile (新規)
├── README.md
└── app
├── docker-compose.yml (更新)
├── flyway
├── mysql
├── schemaspy
└── web
docker-compose.yml
赤字の箇所を追記します。
version: '3'
x-template: &flyway-cmd
build: ./flyway
volumes:
- ./flyway/sql:/flyway/sql
- ./flyway/conf:/flyway/conf
depends_on:
mysql:
condition: service_healthy
profiles:
- flyway
networks:
- net
x-schemaspy-cmd: &schemaspy-cmd
build: ./schemaspy
volumes:
- ./schemaspy/local.properties:/schemaspy.properties
- ./schemaspy/output:/output
environment:
SCHEMASPY_OUTPUT: /output
depends_on:
mysql:
condition: service_healthy
profiles:
- schemaspy
networks:
- net
x-mysql: &mysql-base
build: ./mysql
platform: linux/x86_64
volumes:
- ./mysql/my.cnf:/etc/mysql/conf.d/my.cnf
networks:
- net
services:
web:
build: ./web
container_name: web
platform: linux/x86_64
privileged: true
volumes:
- ./web/CodeIgniter-3.1.13/application:/var/www/application
- ./web/CodeIgniter-3.1.13/system:/var/www/system
- ./web/index.php:/var/www/html/index.php
- ./web/info.php:/var/www/html/info.php
- ./web/.htaccess:/var/www/html/.htaccess
- ./web/httpd.conf:/etc/httpd/conf/httpd.conf
- ./web/xhprof-html.conf:/etc/httpd/conf.modules.d/xhprof-html.conf
- ./web/xdebug.ini:/etc/opt/remi/php74/php.d/xdebug.ini
ports:
- 8080:80
networks:
- net
mysql:
<<: *mysql-base
container_name: mysql
ports:
- 127.0.0.1:3306:3306
environment:
MYSQL_DATABASE: ${MYSQL_DATABASE}
MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD}
TZ: ${TZ}
healthcheck:
test: ["CMD", "mysqladmin" ,"ping", "-h", "localhost"]
start_period: "10s" # 起動までの時間
retries: 3 # 許容する失敗回数
timeout: "5s" # 許容するレスポンスタイム
interval: "60s" # ヘルスチェックの間隔
mysql-test:
<<: *mysql-base
container_name: mysql-test
ports:
- 127.0.0.1:3307:3306
environment:
MYSQL_DATABASE: ${MYSQL_DATABASE}_test
MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD}
TZ: ${TZ}
healthcheck:
test: ["CMD", "mysqladmin" ,"ping", "-h", "localhost"]
start_period: "10s" # 起動までの時間
retries: 3 # 許容する失敗回数
timeout: "5s" # 許容するレスポンスタイム
interval: "60s" # ヘルスチェックの間隔
flyway-cmd:
<<: *flyway-cmd
flyway-baseline:
<<: *flyway-cmd
command: baseline
flyway-migrate:
<<: *flyway-cmd
command: migrate
flyway-info:
<<: *flyway-cmd
command: info
schemaspy-cmd:
<<: *schemaspy-cmd
networks:
net:
Makefile
下記の内容で新規作成します。
SHELL = /bin/bash
WOKR_DIR = ./app
.PHONY: setup ps build up down setup_db setup_test_db test
setup:
@make build
@make up
@make setup_db
ps:
cd $(WOKR_DIR) \
&& docker compose ps
build:
cd $(WOKR_DIR) \
&& docker compose build
up:
cd $(WOKR_DIR) \
&& docker compose up -d
down:
cd $(WOKR_DIR) \
&& docker compose down
setup_db:
cd $(WOKR_DIR) \
&& docker compose run --rm flyway-baseline \
&& docker compose run --rm flyway-migrate \
&& docker compose run --rm flyway-info \
&& docker compose run --rm schemaspy-cmd
setup_test_db:
cd $(WOKR_DIR) \
&& docker compose run --rm flyway-cmd baseline -configFiles=/flyway/conf/flyway-test.conf \
&& docker compose run --rm flyway-cmd migrate -configFiles=/flyway/conf/flyway-test.conf \
&& docker compose run --rm flyway-cmd info -configFiles=/flyway/conf/flyway-test.conf
test:
cd $(WOKR_DIR) \
&& docker-compose run web sh -c "cd /var/www/application/tests && /var/www/vendor/bin/phpunit"
動作確認
下記のコマンドを実行します。
make setup
ブラウザで、「http://localhost:8080/」にアクセスして、下図のような表示なっていればOKです。
解説
makeコマンドとは
makeコマンドは、ソースコードから実行可能なバイナリファイルを生成するための自動化ツールです。Makefileと呼ばれるテキストファイルにターゲットや依存関係を定義し、makeコマンドを実行することで、指定されたターゲットの依存関係を自動的に解決し、必要に応じてコンパイルやリンクを行います。
以下はmakeコマンドの基本的な使用方法です。
- Makefileを作成する 最初に、ソースコードのビルド手順を記述したMakefileを作成します。Makefileは、ターゲットとその依存関係、コマンド、変数などを定義します。
- makeコマンドを実行する makeコマンドを実行すると、Makefileに記述されたターゲットがビルドされます。デフォルトでは、Makefile内の最初のターゲットがビルドされます。
- ターゲットを指定する 特定のターゲットをビルドする場合は、makeコマンドにそのターゲット名を指定します。例えば、以下のようになります。
make target_name
- 依存関係を自動的に解決する makeコマンドは、指定されたターゲットの依存関係を自動的に解決し、必要なファイルをコンパイルしてビルドします。必要に応じて、リンク処理も行います。
- Makefileを更新する ソースコードに変更が加えられた場合は、Makefileを更新する必要があります。変更されたファイルのみ再コンパイルされ、必要に応じてリンクが更新されます。
以上がmakeコマンドの基本的な使い方です。Makefileの書き方やmakeコマンドのオプションについては、manページやオンラインのリファレンスを参照してください。
このように、makeコマンドはソースを実行可能なバイナリファイルを生成するために使用されているコマンドで、ビルドプロセスを自動化するためのツールであるともいえます。また、docker-composeは、Dockerコンテナを複数のサービスとして定義して管理するためのツールです。これらのツールを組み合わせることで、複雑なアプリケーションのビルドやデプロイを簡素化できるようにしています。
.PHONYとは
Makefileにおいて、.PHONYとは、ターゲットとして扱われるものが、実際に存在するファイルとしてではなく、単に実行コマンドとして扱われることを指定するためのキーワードです。つまり、.PHONYを指定したターゲットは、実際のファイルを生成するわけではなく、Makefile内で定義されたコマンドを実行することが目的となります。
.PHONYを使うことで、Makefileがより正確かつ安全に動作するようになります。なぜなら、Makefileは、ターゲットが依存するファイルが更新されていない場合は、ターゲット自体の更新をスキップするため、依存するファイルとターゲットの関係が正確に設定されている必要があるからです。しかし、.PHONYを指定することで、実際のファイルを生成するわけではないため、依存するファイルが存在しないことを保証することができます。
以下に、.PHONYを使った例を示します。
.PHONY: all clean
CC = gcc
CFLAGS = -Wall -O2
all: program
program: main.o func1.o func2.o
$(CC) $(CFLAGS) -o program main.o func1.o func2.o
main.o: main.c
$(CC) $(CFLAGS) -c main.c
func1.o: func1.c
$(CC) $(CFLAGS) -c func1.c
func2.o: func2.c
$(CC) $(CFLAGS) -c func2.c
clean:
rm -f program *.o
この例では、allとcleanという2つの.PHONYターゲットが定義されています。allターゲットは、programという実行ファイルを生成するために、main.o、func1.o、func2.oという3つのオブジェクトファイルが必要であることを示しています。一方、cleanターゲットは、生成された実行ファイルとオブジェクトファイルを削除するために定義されています。
.PHONYを使うことで、makeコマンドを実行する際に、allやcleanがファイル名として存在するかどうかをチェックすることなく、直接ターゲットを実行することができます。例えば、make allを実行すると、実行ファイルprogramが生成されます。また、make cleanを実行すると、生成された実行ファイルとオブジェクトファイルが削除されます。
makeコマンドがビルドツールなので、この記事での使用方法が初見の方は、上記の概念が分かりづらいと思いますが、そういうものだと理解するのが良さそうです。
healthcheckについて
docker-compose.ymlにおける下記の記述に関する解説になります。
healthcheck:
test: ["CMD", "mysqladmin" ,"ping", "-h", "localhost"]
start_period: "10s" # 起動までの時間
retries: 3 # 許容する失敗回数
timeout: "5s" # 許容するレスポンスタイム
interval: "60s" # ヘルスチェックの間隔
上記は、Dockerコンテナのヘルスチェックを定義するためのコードです。具体的には、Dockerコンテナ内でMySQLサーバーを起動する際に、ヘルスチェックを行うために使用されます。
このコードには、以下のような設定が含まれています。
test
: ヘルスチェックに使用するコマンドを指定します。ここでは、mysqladmin ping -h localhost
というコマンドが指定されています。このコマンドは、MySQLサーバーにpingを送信して、応答が返ってくるかどうかを確認するために使用されます。start_period
: コンテナの起動時にヘルスチェックを待機する時間を指定します。ここでは、10s
が指定されています。retries
: ヘルスチェックに失敗した場合に再試行する回数を指定します。ここでは、3
回まで再試行されます。timeout
: ヘルスチェックのレスポンスが返るまでに許容される時間を指定します。ここでは、5s
が指定されています。interval
: ヘルスチェックを実行する間隔を指定します。ここでは、60s
が指定されています。
これらの設定により、Dockerコンテナが起動した後、mysqladmin ping -h localhost
というコマンドが10秒ごとに最大3回試行され、5秒以内に応答がなければ、コンテナが異常とみなされます。異常とみなされた場合は、Dockerエンジンが自動的に再起動を試みます。
このように、ヘルスチェックを定義することで、Dockerコンテナの健全性を監視し、必要に応じて自動的に再起動することができます。
今回は、DBの起動を確認して、DBのマイグレーションをする必要がありましたので、DBが起動していることを確認するために、このヘルスチェックを定義しました。マイグレーションするサービスの設定で、下記のように記載して利用します。こうすることで、DBの起動を待って、マイグレーションの処理をすることができます。このようにしないと、DBの起動前にマイグレーション処理が実行されて、DBが起動していないためにエラーになることがあります。
depends_on:
mysql:
condition: service_healthy
おわりに
今日は、dockerで構築した開発環境にmakeコマンドを導入する方法をご紹介しました。これで、いろいろなコマンドを組み合わせないと行けない場面でも、makeコマンド一つで実施することができるようになると思いますので、是非、使ってみてください。
今回使用したファイルは下記のGitHubにタグ付けしています。
また明日お会いしましょう!
コメント