dockerで構築した開発環境にmakeコマンドを導入

スポンサーリンク
dockerで構築した開発環境にmakeコマンドを導入 ノウハウ
dockerで構築した開発環境にmakeコマンドを導入
この記事は約14分で読めます。
よっしー
よっしー

こんにちは。よっしーです(^^)

今日は、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コマンドの基本的な使用方法です。

  1. Makefileを作成する 最初に、ソースコードのビルド手順を記述したMakefileを作成します。Makefileは、ターゲットとその依存関係、コマンド、変数などを定義します。
  2. makeコマンドを実行する makeコマンドを実行すると、Makefileに記述されたターゲットがビルドされます。デフォルトでは、Makefile内の最初のターゲットがビルドされます。
  3. ターゲットを指定する 特定のターゲットをビルドする場合は、makeコマンドにそのターゲット名を指定します。例えば、以下のようになります。
make target_name
  1. 依存関係を自動的に解決する makeコマンドは、指定されたターゲットの依存関係を自動的に解決し、必要なファイルをコンパイルしてビルドします。必要に応じて、リンク処理も行います。
  2. 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にタグ付けしています。

よっしー
よっしー

また明日お会いしましょう!

コメント

タイトルとURLをコピーしました