Laravel/sail環境でcomposerがエラーになる

## 概要
下記のLaravel/Sailを使ってdocker環境を構築し、使っていました。
ある日、`build`すると`composer install`でエラーになったので調べてみた。

**・Github - laravel/sail**
　https://github.com/laravel/sail/blob/1.x/runtimes/8.0/Dockerfile

## エラー内容
以下のようなエラーが発生した。

```
 => ERROR [local/sail-8.0 18/23] RUN composer install                                                                                                                                   1.1s
------
 > [local/sail-8.0 18/23] RUN composer install:
#38 0.735 Do not run Composer as root/super user! See https://getcomposer.org/root for details
#38 0.946 Installing dependencies from lock file (including require-dev)
#38 0.964 Verifying lock file contents can be installed on current platform.
#38 1.004 Your lock file does not contain a compatible set of packages. Please run composer update.
#38 1.004 
#38 1.004   Problem 1
#38 1.004     - Root composer.json requires PHP extension ext-curl * but it is missing from your system. Install or enable PHP's curl extension.

...

#38 1.004 To enable extensions, verify that they are enabled in your .ini files:
#38 1.004     - /etc/php/8.1/cli/php.ini

...

#38 1.004     - /etc/php/8.1/cli/conf.d/20-tokenizer.ini
#38 1.004 You can also run `php --ini` in a terminal to see which files are used by PHP in CLI mode.
#38 1.004 Alternatively, you can run Composer with `--ignore-platform-req=ext-curl --ignore-platform-req=ext-gd --ignore-platform-req=ext-zip --ignore-platform-req=ext-simplexml --ignore-platform-req=ext-mbstring --ignore-platform-req=ext-mbstring --ignore-platform-req=ext-dom --ignore-platform-req=ext-dom --ignore-platform-req=ext-curl --ignore-platform-req=ext-dom --ignore-platform-req=ext-dom --ignore-platform-req=ext-dom --ignore-platform-req=ext-dom --ignore-platform-req=ext-simplexml` to temporarily ignore these required extensions.
------
failed to solve: rpc error: code = Unknown desc = executor failed running [/bin/sh -c composer install]: exit code: 2
```

「`PHP拡張がインストールされていない？`」といった感じでしょうか？。

しかし、Dockerfileを見てみるとちゃんとインストールされています。

```Dockerfile
RUN apt-get update \
    ...
    && apt-get install -y php8.0-cli php8.0-dev \
       php8.0-pgsql php8.0-sqlite3 php8.0-gd \
       php8.0-curl php8.0-memcached \
       php8.0-imap php8.0-mysql php8.0-mbstring \
       php8.0-xml php8.0-zip php8.0-bcmath php8.0-soap \
       php8.0-intl php8.0-readline php8.0-pcov \
       php8.0-msgpack php8.0-igbinary php8.0-ldap \
       php8.0-redis php8.0-swoole php8.0-xdebug \
   ...
```
下記のサイトに記載のような「php-intl」が入っていないというのも該当しないようです。

**・【CakePHP】composerによるインストールでエラーが！**
　https://deep-blog.jp/engineer/15243/

ふとPHPのバージョンを確認してみると...

```bash
# コンテナ内に入る
$ ./sail shell

# バージョン確認
$ php -v

PHP 8.1.1 (cli) (built: Dec 31 2021 07:26:38) (NTS)
Copyright (c) The PHP Group
Zend Engine v4.1.1, Copyright (c) Zend Technologies
    with Zend OPcache v8.1.1, Copyright (c), by Zend Technologies
```

あれ？、`PHP8.0`を使っていたはずなのに、`PHP8.1`になっている...

これが原因かな？

## 対処方法を調べる
とりあえず、PHPコマンドを調べてみる。

```bash
# PHPコマンドの場所を確認する
$ which php
/usr/bin/php

# PHPコマンドを確認する
$ ls -la /usr/bin
/usr/bin/php → /etc/alternatives/php
```
※ 「`alternatives`」のシンボリックリンクになっているようです

Google先生に聞いてみると、複数のバージョンのPHPをインストールして切り替えできる機能のようです。

* [alternatives コマンドで PHP のバージョンを切り替える](https://qiita.com/centipede/items/0a5e2f55ec3f66dc6bd9#alternatives-%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89%E3%81%A7-php-%E3%81%AE%E3%83%90%E3%83%BC%E3%82%B8%E3%83%A7%E3%83%B3%E3%82%92%E5%88%87%E3%82%8A%E6%9B%BF%E3%81%88%E3%82%8B)
* [Ubuntu 20.04にPHPを複数インストールして切り替える方法（PPA・apt）](https://qiita.com/murakami77/items/a9945f2a8e51ca3791de)

さっそくコマンドで現在の状況を確認してみる。

```bash
$ update-alternatives --list php

/usr/bin/php8.0
/usr/bin/php8.1
```
PHP8.0とPHP8.1がインストールされているようです。
PHP8.0に切り替えてみる。

```bash
$ update-alternatives --set php /usr/bin/php8.0

update-alternatives: using /usr/bin/php8.0 to provide /usr/bin/php (php) in manual mode
update-alternatives: warning: skip creation of /usr/share/man/man1/php.1.gz because associated file /usr/share/man/man1/php8.0.1.gz (of link group php) doesn't exist
```
※ 警告が出たが、マニュアル関係のようなので影響なしと判断する

再度、バージョンを確認してみる。

```bash
$ php -v

PHP 8.0.14 (cli) (built: Dec 20 2021 21:23:16) ( NTS )
Copyright (c) The PHP Group
Zend Engine v4.0.14, Copyright (c) Zend Technologies
    with Zend OPcache v8.0.14, Copyright (c), by Zend Technologies
```

`composer install`を再度試したところ、正常にインストールが完了しました。

## まとめ
`Dockerfile`に下記を追加したら、不具合は解消されました。

```Dockerfile
FROM ubuntu:21.04

LABEL maintainer="Taylor Otwell"

...

# ↓ ここを追加する!!!!!!
RUN update-alternatives --set php /usr/bin/php8.0　

RUN setcap "cap_net_bind_service=+ep" /usr/bin/php8.0

RUN groupadd --force -g $WWWGROUP sail
RUN useradd -ms /bin/bash --no-user-group -g $WWWGROUP -u 1337 sail

COPY start-container /usr/local/bin/start-container
COPY supervisord.conf /etc/supervisor/conf.d/supervisord.conf
COPY php.ini /etc/php/8.0/cli/conf.d/99-sail.ini
RUN chmod +x /usr/local/bin/start-container

EXPOSE 8000

ENTRYPOINT ["start-container"]
```

最新のコードを見たら、2022/01/20に修正されたようですね。

* [History for sail/runtimes/8.0/Dockerfile](https://github.com/laravel/sail/commits/1.x/runtimes/8.0/Dockerfile)
![スクリーンショット 2022-01-24 10.25.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/142279/107aecb1-93b7-f3c6-fe66-4f961200dd2d.png)
* [Fix php8.0-dev depending on php8.1-cli](https://github.com/laravel/sail/commit/dbe4a908d254d91f99ed89047c9eec4bae8973b0#diff-e9023f2c440627008776bae3dca38d860595d34e01bace4929cf39cadf2060c8)
![スクリーンショット 2022-01-24 10.26.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/142279/ae6771ac-ef24-71e0-b18c-aa7beeda7509.png)

以上