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