php - Error : "Unable to open image" only in docker container

one text

I have a problem with my symfony application running in docker container.

I have this class :

use Imagine\Gd\Imagine;
use Imagine\Image\Box;

class ImageOptimizer
{
    private $imagine;

    public function __construct()
    {
        $this->imagine = new Imagine();
    }

    public function resize(string $filename, int $maxWidth, int $maxHeight): void
    {
        list($iwidth, $iheight) = getimagesize($filename);
        $ratio = $iwidth / $iheight;
        if ($maxWidth / $maxHeight > $ratio) {
            $maxWidth = $maxHeight * $ratio;
        } else {
            $maxHeight = $maxWidth / $ratio;
        }

        $photo = $this->imagine->open($filename);
        $photo->resize(new Box($maxWidth, $maxHeight))->save($filename);
    }
}

And I get this error :

Imagine\Exception\RuntimeException:
Unable to open image /code/public/uploads/thumbs/5edfa023852b3_image04625777-6124eee4b5d20.jpeg

  at vendor/imagine/imagine/src/Gd/Imagine.php:95
  at Imagine\Gd\Imagine->open('/code/public/uploads/thumbs/5edfa023852b3_image04625777-6124eee4b5d20.jpeg')
     (src/Service/ImageOptimizer.php:33)
  at App\Service\ImageOptimizer->resize('/code/public/uploads/thumbs/5edfa023852b3_image04625777-6124eee4b5d20.jpeg', 203.0513176144244, 244)
     (src/Service/FileUploader.php:67)
  at App\Service\FileUploader->resizeImages('5edfa023852b3_image04625777-6124eee4b5d20.jpeg')
     (src/Service/FileUploader.php:59)
  at App\Service\FileUploader->upload(object(UploadedFile))
     (src/Controller/Admin/NewsController.php:86)
  at App\Controller\Admin\NewsController->editAction(object(Request), 1)
     (vendor/symfony/http-kernel/HttpKernel.php:158)
  at Symfony\Component\HttpKernel\HttpKernel->handleRaw(object(Request), 1)
     (vendor/symfony/http-kernel/HttpKernel.php:80)
  at Symfony\Component\HttpKernel\HttpKernel->handle(object(Request), 1, true)
     (vendor/symfony/http-kernel/Kernel.php:201)
  at Symfony\Component\HttpKernel\Kernel->handle(object(Request))
     (public/index.php:25)               

The same code works in a non-dockerized environnement with the same php version and the same picture !

If I debug the "open" function step by step, I find this :

// file : /code/vendor/imagine/imagine/src/File/Loader.php
    protected function readLocalFile()
    {
        $this->checkLocalFile();
        $data = @file_get_contents($this->path);
        if ($data === false) {
            throw new InvalidArgumentException(sprintf('Failed to read from file %s.', $this->path));
        }

        return $data;
    }

The $data variable contain the binary of the image file, and if I compare the binary from the non dockerized environment, they are different... The $data value from the docker seems to be badly encoded.

There is my docker files :

docker-compose.yml

version: "2"
services:
    web:
        image: nginx:latest
        ports:
            - "80:80"
        volumes:
            - ./code:/code
            - ./default.conf:/etc/nginx/conf.d/default.conf
        links:
            - php
    php:
        build: ./conf
        volumes:
            - ./code:/code
    (...)

conf/Dockerfile

FROM php:7-fpm

RUN apt update \
    && apt install -y libzip-dev libpng-dev libicu-dev

RUN docker-php-ext-install pdo pdo_mysql zip gd intl

And my symfony version is 4.4.26 and the imagine version is 1.2.4.

Source