PHP extension ext-gdが含まれていない場合の対応

# 概要
とある業務でEC-CUBE2系を使うことがあり、
自身のマシンに開発環境を構築しようとしてみたところPHP拡張モジュールがないことでエラーとなってしまったので、
対応した時の内容について記載する。

# 環境構築

以下のGitHubを参考にして構築
https://github.com/honjou/docker-eccube2

## Composer is not installedと表示
`docker-compose up -d`まで行い、localhostにアクセスしたところ、
`Composer is not installed`と表示されたので、
コンテナにアクセスしてcomposerをインストールさせてみる。

```
# コンテナ名確認（ここではlaravel_appを使う）
[xxx@MacBook-xxx docker-eccube2 (main %=)]$ docker-compose ps
            Name                          Command               State                 Ports              
---------------------------------------------------------------------------------------------------------
docker-eccube2_mailcatcher_1   mailcatcher --no-quit --fo ...   Up      1025/tcp, 0.0.0.0:1080->1080/tcp 
eccube2_db                     docker-entrypoint.sh mysql ...   Up      0.0.0.0:3306->3306/tcp, 33060/tcp
laravel_app                    docker-php-entrypoint apac ...   Up      0.0.0.0:80->80/tcp               
phpmyadmin                     /docker-entrypoint.sh apac ...   Up      0.0.0.0:8080->80/tcp             

# コンテナ内にアクセス
[xxx@MacBook-xxx docker-eccube2 (main %=)]$ docker exec -it laravel_app /bin/bash
root@7cd72c0ea344:/var/www/html# 

# composerをダウンロード
root@7cd72c0ea344:/var/www/html# curl -sS https://getcomposer.org/installer | php
All settings correct for using Composer
Downloading...

Composer (version 2.6.2) successfully installed to: /var/www/html/composer.phar
Use it: php composer.phar

# composerを移動
root@7cd72c0ea344:/var/www/html# mv composer.phar /usr/local/bin/composer

# composer.jsonがあるディレクトリに移動
root@7cd72c0ea344:/var/www/html# cd eccube2/

# install
root@7cd72c0ea344:/var/www/html/eccube2# composer install
Installing dependencies from lock file (including require-dev)
Verifying lock file contents can be installed on current platform.
Your lock file does not contain a compatible set of packages. Please run composer update.

  Problem 1
    - Root composer.json requires PHP extension ext-gd * but it is missing from your system. Install or enable PHP's gd extension.

To enable extensions, verify that they are enabled in your .ini files:
    - /usr/local/etc/php/php.ini
    - /usr/local/etc/php/conf.d/docker-php-ext-pdo_mysql.ini
    - /usr/local/etc/php/conf.d/docker-php-ext-sodium.ini
You can also run `php --ini` in a terminal to see which files are used by PHP in CLI mode.
Alternatively, you can run Composer with `--ignore-platform-req=ext-gd` to temporarily ignore these required extensions.

```

`Root composer.json requires PHP extension ext-gd * but it is missing from your system. Install or enable PHP's gd extension.`
とエラーとなったので、gdの確認をする。

## gdが入っていない

php -mでgdが読み込めているか確認したところ、読み込めていなかった。

```
root@7cd72c0ea344:/var/www/html# php -m | grep gd
{何も表示されない}
```

表示されていないので入っていないことを確認したので、一度コンテナを抜けて終了させる。

```
root@7cd72c0ea344:/var/www/html/eccube2# exit
exit
[xxx@MacBook-xxx docker-eccube2 (main %=)]$ docker-compose down
Stopping phpmyadmin                   ... done
Stopping laravel_app                  ... done
Stopping eccube2_db                   ... done
Stopping docker-eccube2_mailcatcher_1 ... done
Removing phpmyadmin                   ... done
Removing laravel_app                  ... done
Removing eccube2_db                   ... done
Removing docker-eccube2_mailcatcher_1 ... done
Removing network docker-eccube2_default
```

## Dockerfileにgdを含める

以下の記事を参考にDockerfileを修正
https://tt-computing.com/docker-php-gd

```Dockerfile
:
:
&& docker-php-ext-install pdo_mysql mysqli gd
```

docker-php-ext-installコマンドに`gd`を追加する。

### 再buildとup

ここからは上で最初に行った対応を実施。

```
[xxx@MacBook-xxx docker-eccube2 (main %=)]$ docker-compose build
:
(省略)
:
[xxx@MacBook-xxx docker-eccube2 (main %=)]$ docker-compose up -d
Creating network "docker-eccube2_default" with the default driver
Creating docker-eccube2_mailcatcher_1 ... done
Creating eccube2_db                   ... done
Creating laravel_app                  ... done
Creating phpmyadmin                   ... done
```

### コンテナにアクセスしてgdの確認

```
[xxx@MacBook-xxx docker-eccube2 (main *%=)]$ docker exec -it laravel_app /bin/bash

# gdが入っているのを確認
root@77e347ed4520:/var/www/html# php -m | grep gd
gd
```

### composer再インストール

```
# composerをダウンロード
root@77e347ed4520:/var/www/html# curl -sS https://getcomposer.org/installer | php
All settings correct for using Composer
Downloading...

Composer (version 2.6.2) successfully installed to: /var/www/html/composer.phar
Use it: php composer.phar

# composerを移動
root@77e347ed4520:/var/www/html# mv composer.phar /usr/local/bin/composer

# install
root@77e347ed4520:/var/www/html# cd eccube2/
root@77e347ed4520:/var/www/html/eccube2# composer install
Installing dependencies from lock file (including require-dev)
Verifying lock file contents can be installed on current platform.
Package operations: 40 installs, 0 updates, 0 removals
  - Downloading fzaninotto/faker (v1.9.2)
  - Downloading react/promise (v2.8.0)
:
(省略)
:
Generating optimized autoload files
：
(省略)
：
Class MDB2_PEARProxy located in ./data/vendor/silverorange/mdb2/MDB2/Wrapper/peardb.php does not comply with psr-0 autoloading standard. Skipping.
3 packages you are using are looking for funding.
Use the `composer fund` command to find out more!
```

localhostにアクセスしてEC-CUBEインストール画面が表示されたらOK

![スクリーンショット 2023-09-10 6.30.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/248644/04d93939-6c4e-6e75-235c-cd474587ee72.png)

ここから先は参考にしている記事を元に起動まで実施できた。