こんにちは。よっしーです(^^)
今日は、PHP ComposerをDockerコンテナに置き換える方法についてご紹介します。
前提
この記事は下記の記事をベースにしています。
背景
先日、slim用のローカル開発環境を構築した際に、PHPのComposerを利用していましたが、PHPをインストールしていなくても利用できるように、ComposerをDockerコンテナに切り替えた方法についてご紹介します。
修正内容
下記のファイルを修正します。修正内容は下記の各セクションにあります。
modified: Makefile
modified: app/compose.yml
Makefile
- cd $(WOKR_DIR)/php-fpm/slim_app \
- && composer install
+ cd $(WOKR_DIR) \
+ && docker compose run -it --rm composer-cmd install
app/compose.yml
25行目に追記します。
+ composer-cmd:
+ image: composer:2.5.8
+ volumes:
+ - ./php-fpm/slim_app:/app
動作確認
下記のコマンドを実行します。
rm -rf app/php-fpm/slim_app/vendor
make composer_install
make up
ブラウザで「localhost:8080」にアクセスして、「Hello world!」が表示されていれば成功です。
解説
composerとは
Composerは、PHPの依存関係管理ツールであり、PHPプロジェクトで外部のライブラリやパッケージを簡単に管理するために使用されます。Composerを使用することで、他の開発者が作成したパッケージやフレームワークを自動的にダウンロードしてプロジェクトに組み込むことができます。
以下に、Composerの基本的な機能と使い方を説明します。
- composer.jsonファイル: Composerプロジェクトのルートディレクトリには、
composer.json
というファイルが存在します。このファイルには、プロジェクトの依存関係や設定情報が記述されます。例えば、必要なパッケージやそのバージョン、プロジェクトのオートローディングの設定などが含まれます。 - パッケージの追加:
composer.json
ファイル内のrequire
セクションに必要なパッケージの情報を追加します。例えば、以下のように記述します。
{
"require": {
"monolog/monolog": "^1.0"
}
}
上記の例では、monolog/monolog
というパッケージを追加しています。
- 依存関係の解決:
composer.json
ファイルを更新した後、コマンドラインでプロジェクトのルートディレクトリに移動し、以下のコマンドを実行します。
composer install
これにより、Composerは定義された依存関係を解決し、必要なパッケージをダウンロードしてvendor
ディレクトリに配置します。
- オートローディング: Composerは、オートローディング機能を提供しています。
composer.json
ファイルのautoload
セクションを使用して、自動的にクラスファイルを読み込む設定を行うことができます。
{
"autoload": {
"psr-4": {
"App\\": "src/"
}
}
}
上記の例では、src
ディレクトリ内のクラスをApp
名前空間に関連付けています。
これらはComposerの基本的な機能ですが、さらに高度な設定や機能も利用することができます。詳細な情報やComposerの使い方については、公式のComposerのドキュメントを参照してください。
composer.lockファイルについて
composer.lock
ファイルは、Composerによって生成されるファイルであり、プロジェクトの依存関係の正確なバージョン情報を含んでいます。このファイルは、パッケージのバージョンの一貫性を確保するために重要です。
以下に、composer.lock
ファイルの役割と使い方について説明します。
- 依存関係の固定化:
composer.lock
ファイルは、プロジェクトに使用されるパッケージとそのバージョンの一覧を含んでいます。このファイルには、プロジェクトが依存するパッケージの特定のバージョンが記録されており、他の開発者が同じ環境で正確なパッケージのバージョンを再現できるようになっています。 - 再現性と安定性の確保:
composer.lock
ファイルが存在する場合、Composerはこのファイルを優先して依存関係を解決します。つまり、composer install
やcomposer update
などのコマンドを実行するときに、Composerはcomposer.lock
ファイルの内容に基づいて依存関係を解決します。これにより、パッケージのバージョンが自動的に更新されることを防ぎ、プロジェクトの再現性と安定性を確保します。 - バージョンの更新と同期:
composer.lock
ファイルが存在しない場合、Composerはcomposer.json
ファイルに記述された依存関係を解決し、新しいバージョンのパッケージをダウンロードします。その後、composer.lock
ファイルが自動的に生成され、現在のパッケージのバージョン情報が含まれるようになります。このようにして、パッケージのバージョン情報を最新に保ちつつ、他の開発者との同期を取ることができます。 - バージョン固定とアップデート:
composer.lock
ファイルが存在する場合、パッケージのバージョンは厳密に固定されます。新しいバージョンがリリースされた場合でも、composer update
を実行してもcomposer.lock
ファイルが更新されません。このため、意図しないバージョンアップが行われることを防ぎ、安定性を保つことができます。
composer.lock
ファイルは、バージョン管理システム(例えばGit)で共有されるべきです。これにより、チーム内の他の開発者が同じ環境で作業できるようになります。また、プロジェクトをデプロイする際にも、composer.lock
ファイルが含まれていることを確認し、正確なパッケージのバージョンをデプロイ先で使用することが重要です。
重要なのは、composer.lock
ファイルは手動で編集すべきではないということです。代わりに、composer.json
ファイルを更新し、依存関係の変更を反映させ、Composerにcomposer.lock
ファイルを再生成させるべきです。
app/compose.yml
composer-cmd:
image: composer:2.5.8
volumes:
- ./php-fpm/slim_app:/app
composer-cmd
: これはサービスの名前です。Docker Composeでは、コンテナやサービスに名前を付けることができます。この場合、composer-cmd
という名前のサービスが定義されています。image: composer:2.5.8
: この行は、Dockerイメージの指定を行っています。composer:2.5.8
というイメージを使用します。ここで指定されたイメージは、Docker HubからダウンロードされるComposerのバージョン2.5.8です。volumes: - ./php-fpm/slim_app:/app
: この行は、ボリュームのマウントを行っています。./php-fpm/slim_app
というホスト側のディレクトリが、コンテナ内の/app
ディレクトリにマウントされます。これにより、ホスト側のディレクトリとコンテナ内のディレクトリとの間でファイルの共有やデータの永続化が可能になります。この場合、./php-fpm/slim_app
ディレクトリがComposerコンテナの/app
ディレクトリと関連付けられます。
上記の設定は、composer-cmd
という名前のサービスを定義し、Composerのイメージを使用します。また、ホスト側のディレクトリとコンテナ内の/app
ディレクトリとをマウントします。これにより、ホスト側のディレクトリ内のファイルがComposerコンテナ内の/app
ディレクトリで利用できるようになります。この設定は、PHP-FPMとSlimアプリケーションを使用している環境で、Composerを使用して依存関係を解決するために使用される可能性があります。
Makefile
docker compose run -it --rm composer-cmd install
docker-compose
: Docker Composeコマンドを実行するためのコマンドです。Docker Composeは、複数のDockerコンテナを定義し、管理するためのツールです。run
: Dockerコンテナ内でコマンドを実行するためのオプションです。-it
: インタラクティブモードでコマンドを実行するためのオプションです。これにより、ターミナルとの対話が可能になります。--rm
: コマンドの実行が終了した後にコンテナを自動的に削除するオプションです。一時的な作業用コンテナを使用する場合に便利です。composer-cmd
: Docker Composeファイルで定義されたコンテナのサービス名です。この場合、composer-cmd
はComposerを実行するために定義されたサービス名です。install
: Composerコマンドの一部であり、プロジェクトの依存関係を解決し、必要なパッケージをインストールするために使用されます。
つまり、上記のコマンドは、Docker Composeを使用してcomposer-cmd
という名前のサービスを起動し、そのサービス内でcomposer install
コマンドを実行します。これにより、Composerがプロジェクトの依存関係を解決し、必要なパッケージをインストールします。実行終了後、コンテナは自動的に削除されます。
おわりに
今日は、PHP ComposerをDockerコンテナに置き換える方法についてご紹介しました。
自分のローカルマシンにアプリをインストールしなくても、Dockerさえインストールしておけば利用できるので、インストールの手間が省けていいですよね。また、他の人にも共有しやすくて便利だなたと思いました。
本記事でご紹介したソースは、下記のリポジトリにあります。
https://github.com/Gate-Yossi/Ran/releases/tag/v2023.07.13
何か質問や相談があれば、遠慮なくコメントしてください。また、エンジニア案件についても、いつでも相談にのっていますので、お気軽にお問い合わせください。
それでは、また明日お会いしましょう(^^)
コメント