【Dcoker・Laravel】エラー対処法 Fatal error: Composer detected issues in your platform: Your Composer dependencies require a PHP version

laravel-prograshi(プロぐらし) Laravel
記事内に広告が含まれていることがあります。

Docker上に構築したLaravelを起動したときに、以下のエラーが発生した時の対処法についてまとめています。

Fatal error: Composer detected issues in your platform: Your Composer dependencies require a PHP version ">= 7.3.0". You are running 7.2.34. in /var/www/vendor/composer/platform_check.php on line 24


エラーの内容詳細

表示された以下のエラーの内容は「Composerを使うために必要なPHPのバージョンが7.3.0以上である必要があるのに、バージョンが低すぎる」という内容です。

Fatal error: Composer detected issues in your platform: Your Composer dependencies require a PHP version ">= 7.3.0". You are running 7.2.34. in /var/www/vendor/composer/platform_check.php on line 24


問題のDockerfile

ここでは、以下のようにPHP-FPMのイメージのバージョンに「7.2」を指定しています。これがエラーの原因となっています。

FROM php:7.2-fpm

# Copy composer.lock and composer.json
COPY composer.lock composer.json /var/www/

# Set working directory
WORKDIR /var/www

# Install dependencies
RUN apt-get update && apt-get install -y \
    build-essential \
    libpng-dev \
    libjpeg62-turbo-dev \
    libfreetype6-dev \
    locales \
    zip \
    jpegoptim optipng pngquant gifsicle \
    vim \
    unzip \
    git \
    curl

# Clear cache
RUN apt-get clean && rm -rf /var/lib/apt/lists/*

# Install extensions
RUN docker-php-ext-install pdo_mysql mbstring zip exif pcntl
RUN docker-php-ext-configure gd --with-gd --with-freetype-dir=/usr/include/ --with-jpeg-dir=/usr/include/ --with-png-dir=/usr/include/
RUN docker-php-ext-install gd

# Install composer
RUN curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer

# Add user for laravel application
RUN groupadd -g 1000 www
RUN useradd -u 1000 -ms /bin/bash -g www www

# Copy existing application directory contents
COPY . /var/www

# Copy existing application directory permissions
COPY --chown=www:www . /var/www

# Change current user to www
USER www

# Expose port 9000 and start php-fpm server
EXPOSE 9000
CMD ["php-fpm"]


対応方法

エラーの対処法は以下の3ステップになります。

対処法
  1. ベースイメージのバージョンを上げる。(FROM php:7.3-fpm)
  2. パッケージlibonig-devとlibzip-devを追加。(apt-get install -yのところ)
  3. エクステンションのmbstringを削除(libonigが代替する)


ベースイメージのバージョンを上げる

まずはPHP-FPMのベースイメージのバージョンを上げます。今回のエラーはバージョン7.3以上を使ってくれという内容なので「7.3」を指定します。

FROM php:7.2-fpm

 ↓ 以下に修正

FROM php:7.3-fpm


パッケージlibonig-devとlibzip-devを追加

PHP-FPMのバージョンを7.3に上げたことで発生するエラーを回避するために、以下の2つのパッケージを追加します。

# Install dependencies
RUN apt-get update && apt-get install -y \
    build-essential \
    libpng-dev \
    libjpeg62-turbo-dev \
    libfreetype6-dev \
    locales \
    zip \
    jpegoptim optipng pngquant gifsicle \
    vim \
    unzip \
    git \
    curl \
    libonig-dev \
    libzip-dev


エクステンションのmbstringを削除

上記で、liboning-devを導入したことで、PHPのエクステンションとして導入している「mbstring」が不要になります。このため、「mbstring」を削除します。

# Install extensions
RUN docker-php-ext-install pdo_mysql mbstring zip exif pcntl

 ↓ 以下に修正

# Install extensions
RUN docker-php-ext-install pdo_mysql zip exif pcntl

以上で修正は完了です。


修正後のDockerfile

修正後の全体のDockerfileは以下のようになります。

FROM php:7.3-fpm

# Copy composer.lock and composer.json
COPY composer.lock composer.json /var/www/

# Set working directory
WORKDIR /var/www

# Install dependencies
RUN apt-get update && apt-get install -y \
    build-essential \
    libpng-dev \
    libjpeg62-turbo-dev \
    libfreetype6-dev \
    locales \
    zip \
    jpegoptim optipng pngquant gifsicle \
    vim \
    unzip \
    git \
    curl \
    libonig-dev \
    libzip-dev

# Clear cache
RUN apt-get clean && rm -rf /var/lib/apt/lists/*

# Install extensions
RUN docker-php-ext-install pdo_mysql zip exif pcntl
RUN docker-php-ext-configure gd --with-gd --with-freetype-dir=/usr/include/ --with-jpeg-dir=/usr/include/ --with-png-dir=/usr/include/
RUN docker-php-ext-install gd

# Install composer
RUN curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer

# Add user for laravel application
RUN groupadd -g 1000 www
RUN useradd -u 1000 -ms /bin/bash -g www www

# Copy existing application directory contents
COPY . /var/www

# Copy existing application directory permissions
COPY --chown=www:www . /var/www

# Change current user to www
USER www

# Expose port 9000 and start php-fpm server
EXPOSE 9000
CMD ["php-fpm"]


PHPのバージョンがcomposerよりも高い場合

上記はPHPのバージョンが指定よりも低かったために発生したエラーです。

場合によっては、PHPのバージョンがComposerよりも高い状況が発生することもあります。

PHPのバージョンが高すぎてダウングレードを要求された場合はダウングレードせずとも、composerの設定ファイルを書き換えることで対応できます。


対応方法

composer.jsonのconfigに以下を追加

    "config": {
        (省略)
        "platform-check": false
    },

以上で、エラーを拾っていた機能をOFFにすることができます。


(補足)エラーを実行している処理

なお、今回表示されたエラーを拾う処理が書かれているのは、vendor/composer/platform_check.phpです。

<?php

// platform_check.php @generated by Composer

$issues = array();

if (!(PHP_VERSION_ID >= 70300)) {
    $issues[] = 'Your Composer dependencies require a PHP version ">= 7.3.0". You are running ' . PHP_VERSION . '.';
}

if ($issues) {
    if (!headers_sent()) {
        header('HTTP/1.1 500 Internal Server Error');
    }
    if (!ini_get('display_errors')) {
        if (PHP_SAPI === 'cli' || PHP_SAPI === 'phpdbg') {
            fwrite(STDERR, 'Composer detected issues in your platform:' . PHP_EOL.PHP_EOL . implode(PHP_EOL, $issues) . PHP_EOL.PHP_EOL);
        } elseif (!headers_sent()) {
            echo 'Composer detected issues in your platform:' . PHP_EOL.PHP_EOL . str_replace('You are running '.PHP_VERSION.'.', '', implode(PHP_EOL, $issues)) . PHP_EOL.PHP_EOL;
        }
    }
    trigger_error(
        'Composer detected issues in your platform: ' . implode(' ', $issues),
        E_USER_ERROR
    );
}

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