【Docker+Laravel】テスト用のダミーファイルの生成の際に出たエラーたち


状況

Dockerの環境でLaravelアプリのテストの際、ダミーの画像ファイルを作ろうと思い、公式リファレンスにもあるfile()を利用しました。

公式リファレンス(ファイルアップロードのテスト)
https://readouble.com/laravel/5.8/ja/http-tests.html?header=%25E3%2583%2595%25E3%2582%25A1%25E3%2582%25A4%25E3%2583%25AB%25E3%2582%25A2%25E3%2583%2583%25E3%2583%2597%25E3%2583%25AD%25E3%2583%25BC%25E3%2583%2589%25E3%2581%25AE%25E3%2583%2586%25E3%2582%25B9%25E3%2583%2588

$file = UploadedFile::fake()->image('avatar.jpg');

テストしてみるとこんなエラーが...

Tests\Feature\InformationControllerTest::testStore
Call to undefined function Illuminate\Http\Testing\imagecreatetruecolor()

最初はクラスをuseしてないのかな?とかLaravelアプリ側の問題だと思いましたが、どうやらこのfile()メソッドが定義されるIlluminate\Http\UploadedFileクラスを使うには、PHP GDというPHPのライブラリが必要なようです。

PHP GDのインストール

DockerfileにPHP GDのインストールを追加してみます。

RUN apt-get update && apt-get install -y \
    zlib1g-dev \
    libzip-dev \
    mariadb-client \
  && docker-php-ext-install zip pdo_mysql gd 

上のように書き換え、再構築してみると、次はこんなエラーが

configure: error: png.h not found

調べるとdocker-php-ext-install gdをするだけでは足りず、
libfreetype6-dev
libjpeg62-turbo-dev
libpng-dev
依存関係のある三つのパッケージを事前に apt-get install する必要があるみたいです。

Dockerfileを修正します。
docker-php-ext-install gdの実行前に三つのパッケージのapt-get installを書きます。

RUN apt-get update && apt-get install -y \
    zlib1g-dev \
    libzip-dev \
    mariadb-client \
    libfreetype6-dev \
    libjpeg62-turbo-dev \
    libpng-dev \
  && docker-php-ext-install zip pdo_mysql gd 

再度buildしてみると正常に構築できました。

本当にインストールできているか確認してみます。

gd

GD Support => enabled
GD Version => bundled (2.1.0 compatible)
GIF Read Support => enabled
GIF Create Support => enabled
PNG Support => enabled
libPNG Version => 1.6.36
WBMP Support => enabled
XBM Support => enabled

ちゃんとインストールできたようですね。