【Docker】最小限の構成でcomposer実行環境を作る

ライブラリ単体でちょっとした動作確認を行いたい時に便利です。
最小限の構成のため、コードを1行ずつ理解しながら進めやすいと思います。

# ゴール
composerを利用してPHPUnitをインストールし、動作検証まで実行します。
- Dockerを利用してcomposerをインストールできる。
- コンテナにライブラリをインストールできる。

## 最終的なディレクトリ構成
```bash
.
├── Calculation.php
├── CalculationTest.php
├── Dockerfile
├── composer.json
├── composer.lock
├── docker-compose.yml
└── vendor
```

# 注意点
記事中のコードは自習用を想定しているため、下記は考慮していません。
- vendor/のマウント設定
- composer.jsonの詳細な設定

# composerのインストール
## ディレクトリ構成
```bash
$ tree
.
├── Dockerfile         # New!
└── docker-compose.yml # New!
```


## Dockerfileの作成
- 公式サイトの設定を流用しています。
[Php - Official Image | Docker Hub](https://hub.docker.com/_/php)
[Composer - Official Image | Docker Hub](https://hub.docker.com/_/composer) 
- ``git`` ``zip`` ``unzip``はcomposerを利用したライブラリのインストールに必要なパッケージです。

```Dockerfile
FROM php:7.4-cli
# パッケージリスト更新後にパッケージをインストール
RUN apt-get update && apt-get install -y git zip unzip
COPY . /usr/src/myapp
# composerのインストール
COPY --from=composer /usr/bin/composer /usr/bin/composer
WORKDIR /usr/src/myapp
```

## docker-compose.ymlの作成
- ローカルの変更をコンテナへマウントしています。
- それ以外はコンテナの起動を継続させるための最小限の設定です。

```docker-compose.yml
version: "3"

services:
  my-php-app:
    # カレントディレクトリでイメージを構築
    build: .
    # カレントディレクトリをコンテナへマウント
    volumes:
      - "./:/usr/src/myapp"
    # プロセスを継続させてコンテナの正常終了を防ぐ
    stdin_open: true
```

## コンテナ起動
コンテナを起動します。
```bash
$ docker-compose up -d
```

コンテナの起動状況を確認します。
```bash
$ docker-compose ps
NAME                             COMMAND                  SERVICE             STATUS              PORTS
php_composer_test-my-php-app-1   "docker-php-entrypoi…"   my-php-app          running
```

## インストール確認

コンテナ内でcomposerのバージョンを確認します。
```bash
$ docker-compose exec my-php-app composer --version
Composer version 2.2.7 2022-02-25 11:12:27
```

composerのインストールまで確認できました。

# ライブラリのインストール
composer.jsonを作成後、composer installを実行します。
## ディレクトリ構成
```bash
$ tree
.
├── Dockerfile
├── composer.json      # New!
└── docker-compose.yml
```

## composer.jsonの作成
PHPUnitをインストールします。

```composer.json
{
  "require-dev": {
    "phpunit/phpunit": "*"
  }
}
```

## インストール
コンテナ内でcomposer installを実行します。
```bash
$ docker-compose exec my-php-app composer install
```

インストール完了後にPHPUnitのバージョンを確認します。
```bash
$ docker-compose exec my-php-app vendor/bin/phpunit --version
PHPUnit 9.5.16 by Sebastian Bergmann and contributors.
```

ライブラリのインストールも確認できました。

# 動作検証
テスト用のファイルを作成し、動作検証を行います。
## ディレクトリ構成
```bash
$ tree -L 1
.
├── Calculation.php     # New!
├── CalculationTest.php # New!
├── Dockerfile
├── composer.json
├── composer.lock       # composer installにより作成
├── docker-compose.yml
└── vendor              # composer installにより作成
```
## テスト用ファイルの作成
```Calculation.php
<?php

function addition()
{
    return 1 + 1;
}
```
```CalculationTest.php
<?php

require "Calculation.php";

use PHPUnit\Framework\TestCase;

class CalculationTest extends TestCase
{
    public function testAddition()
    {
        $this->assertSame(2, addition());
    }
}

```


## テスト実行
```bash
$ docker-compose exec my-php-app vendor/bin/phpunit CalculationTest.php
PHPUnit 9.5.16 by Sebastian Bergmann and contributors.

.                                                                   1 / 1 (100%)

Time: 00:00.131, Memory: 4.00 MB

OK (1 test, 1 assertion)
```
テストの実行まで確認できました。

# まとめ
composerやライブラリを単体で使う機会はあまり無いと思いますが、環境を構築するための最小限の設定が理解できました。

# 採用PR
弊社で一緒に働く仲間を募集しています。
全てのオタクを幸せにしたい方、是非ご覧ください！

https://hrmos.co/pages/vivion/jobs/0000191