Skip to content

SOLVED: JPEG/JPG-Attachments führen zu RuntimeExceptions - Dockerfile angepasst auf PHP7.4 Syntax #112

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Closed
microplayer opened this issue May 30, 2021 · 2 comments
Labels
bug Something isn't working

Comments

@microplayer
Copy link

microplayer commented May 30, 2021

Im Rahmen weiterer Tests nach der manuellen Neuanlage der SQLite-DB fiel mir auf:
PDF-Dateien können mit dem aktuellen Docker-File für Part-DB 1.0.0-alpha vom Commit "7bdf453" im März 2021 problemlos als Attachments zu Parts hinzugefügt werden. Sie werden gespeichert, man kann sie downloaden und auch als Download aus Part-DB heraus direkt ansehen.
Gleiches gilt für PNG-Dateien, um Fotos von Bauteilen in Part-DB abzulegen.
Eine RuntimeException kommt dagegen sofort, wenn man versucht, ein JPG-Foto als Attachment zum Bauteil hinzuzufügen. Glücklicherweise konnte ich es unmittelbar mit dem "Delete"-Button rechts wieder löschen, ohne die Datenbank zu korrumpieren.
Bei der weiteren Kontrolle in der CLI des Containers fiel dann aber auf, das die bemängelte Datei tatsächlich unter dem richtigen Namen in pubic_media existierte!!! Siehe beide angehängte Hardcopies.
Das brachte mich zu dem Schluß, dass Part-DB wohl ein Problem mit der Verarbeitung von JPG-Files hat. Einige wenige Google-Klicks später: https://github.com/docker-library/php/issues/912
Und https://github.com/php/php-src/blob/PHP-7.4/UPGRADING#L755-L764

Der Nachweis fällt leicht - irgendwo in den verlinkten Dokumenten ist ein Verweis auf den folgenden Befehl:
php -r 'print_r(gd_info());'
Die Ausgabe im aktuellen Container der 1.0.0-alpha lautet:
Array
(
[GD Version] => bundled (2.1.0 compatible)
[FreeType Support] =>
[GIF Read Support] => 1
[GIF Create Support] => 1
[JPEG Support] =>
[PNG Support] => 1
[WBMP Support] => 1
[XPM Support] =>
[XBM Support] => 1
[WebP Support] =>
[BMP Support] => 1
[TGA Read Support] => 1
[JIS-mapped Japanese Font Support] =>
)

@jan: Im Dockerfile wäre wohl folgende Änderung seit PHP 7.4 "irgendwie" zu berücksichtigen:
docker-php-ext-configure gd --with-freetype --with-jpeg

Dann sollte die Verarbeitung von JPG-Dateien wieder funktionieren.
Ich habe versucht, manuell diese JPG-Unterstützung nachträglich in meinen Container hinein zu

installieren. Leider bislang erfolglos.

@jan: Bitte überprüfe meine Informationen und lade ggf. einen angepassten Container auf den Docker-Hub. Vielen Dank vorab!

Grüße, Microplayer

Runtime Exception für JPG-Foto
JPG-Foto existiert in public_media

@microplayer microplayer added the bug Something isn't working label May 30, 2021
@microplayer microplayer changed the title JPG-Attachments führen zu RuntimeExceptions - Grund: "gd has unrecognized options in PHP 7.4 #912" SOLVED: JPEG/JPG-Attachments führen zu RuntimeExceptions - Dockerfile angepasst auf PHP7.4 Syntax Jun 6, 2021
@microplayer
Copy link
Author

microplayer commented Jun 6, 2021

Anbei mein angepasstes "Dockerfile", mit dem ich ein Image und damit einen Container erzeugen kann, der endlich auch  JPEG/JPG Files als Attachment für Parts akzeptiert - also ohne eine Exception 500 zu verursachen.
# WICHTIG! Dies ist das Ergebnis von Lesen und Trial und Error! Gesichertes Knowhow als SW-Entwickler fehlt leider. 

@Jan: Ich bin in Git noch nicht so sicher, das ich einfach so einen Pull-Request(?) aus meinem geclonten Repository starte.
Daher prüfe mein erfolgreich getestetes "Dockerfile" und spiele es bitte von Deiner Seite aus ein.

Grüße, Microplayer

----------------- Das angepasste Dockerfile ---------------------

# Microplayer, 06.06.2021 - Der Anfang bis "Install yarn" angepasst für neue Parameter ab PHP7.4 für die Integration des JPEG-formats für GD 
# Bei Problemen mit der Integration von "freetype2" gibt es Empfehlungen wie diese "FROM php:7.3-fpm-stretch" - funktioniert aber auch ohne
# Geht mit "-stretch" aber vielleicht auch eleganter? - Siehe: https://github.com/docker-library/php/issues/865
FROM php:7-apache

# Microplayer: "apt-get install -y" - answer Yes (y) to the subsequent prompt (typically whether or not to continue after displaying the additional disk space that will be used)
# Auf der Fehlersuche bis zur erfolgreichen Integration des JPEG-Formats für GD bzw. PHP für Part-DB1 wurden zahlreiche Webseiten besucht.
# https://github.com/docker-library/php/issues/912
# https://hub.docker.com/_/php
# https://github.com/docker-library/php/issues/225
# https://github.com/docker-library/php/issues/865
# https://gist.github.com/shov/f34541feae29afedd93208df4bf428f3
# https://www.php.net/manual/de/image.installation.php
# Dazu noch etliche andere, die Vermutungen bestätigt oder ausgeschlossen haben, die ich aber nicht gespeichert habe 

# Hier nun die initiale Installation von Packages in das Apache-Image hinein - hier erfolgen die ersten wichtigen Ergänzungen und Änderungen!!! 
# WICHTIG! Dies ist das Ergebnis von Lesen und Trial und Error! Gesichertes Knowhow als SW-Entwickler fehlt leider. 
# 1. In mehreren Artikeln wurde die Installation von "pkg-config" empfohlen: https://github.com/docker-library/php/issues/865
# 2. Beim Experimentieren mit "docker-compose" stößt man schnell auf die fehlende "libjpeg" Library - die aktuelle Version ist wohl "libjpeg-dev"  
# 3. Auf der Suche nach PHP, GD, JPEG stößt man schnell auf die "freetype" Library(?) - oder auch "freetype2" - der aktuelle Name lautet "libfreetype6-dev" 
# 4. Das Apache-Image hat keine Editor installiert, deshalb "vim" hinzugefügt - war bei Problemen mit der SQLite3-DB recht nützlich
# 5. Es fanden sich Hinweise im Web, dass das Löschen von "/var/lib/apt/lists/*" evt. Ärger mit der Installation von "gd" macht - getestet, aber hier keine negativen Erfahrungen gemacht
# 6. Zum Schluß noch die "apt-get" Installationsdateien entfernt - https://opensource.com/article/20/5/optimize-container-builds  
# Das neue Image ist damit nur noch 944MB groß
RUN apt-get update &&  apt-get install -y pkg-config curl libcurl4-openssl-dev libicu-dev \
    libpng-dev libjpeg-dev libfreetype6-dev gnupg zip libzip-dev libonig-dev libxslt-dev vim \
    && apt-get -y autoremove && apt-get clean autoclean && rm -rf /var/lib/apt/lists/*

# Microplayer: Dies sind die mit PHP7.4 nötigen, geänderten Parameter für die Integration des JPEG-Formates
# Ein Stolperstelle besteht darin, dass ZUERST der Install "docker-php-ext-configure gd" erfolgen muss, und DANN ERST "docker-php-ext-install gd"
RUN docker-php-ext-configure gd --with-freetype --with-jpeg && docker-php-ext-install gd
# Der Erfolg lässt sich im laufenden Container prüfen: "RUN php -r 'var_dump(gd_info());' " - oder auch mit: "php -r 'print_r(gd_info());' "
# Zugang zum Testen mit "sudo docker exec -it partdb /bin/bash - und dort eingeben/kopieren
# Dort muss für die Extension JPEG = 1 = true angezeigt werden.

# Microplayer: Nun folgt der Rest des Original-Dockerfiles - aus der nachfolgenden Zeile haben wir effektiv den "docker-php-ext-configure gd ..." VORGEZOGEN - fehlt nachfolgend also
RUN docker-php-ext-install pdo_mysql curl intl mbstring bcmath zip xml xsl

# Install yarn
RUN curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | apt-key add -
RUN echo "deb https://dl.yarnpkg.com/debian/ stable main" | tee /etc/apt/sources.list.d/yarn.list
RUN apt-get update && apt-get install -y yarn

COPY --from=composer:latest /usr/bin/composer /usr/bin/composer

WORKDIR /var/www/html
COPY --chown=www-data:www-data . .

# Setup apache2
RUN a2dissite 000-default.conf
COPY ./.docker/symfony.conf /etc/apache2/sites-available/symfony.conf
RUN a2ensite symfony.conf
RUN a2enmod rewrite

USER www-data
RUN composer install -a --no-dev && composer clear-cache
RUN yarn install && yarn build && yarn cache clean
RUN php bin/console --env=prod ckeditor:install --clear=skip

# Use demo env to output logs to stdout
ENV APP_ENV=demo
ENV DATABASE_URL="sqlite:///%kernel.project_dir%/uploads/app.db"

USER root

VOLUME ["/var/www/html/uploads", "/var/www/html/public/media"]
EXPOSE 80

@microplayer
Copy link
Author

Since I managed to understand the cause of the issue and found a workaround for my environment, this issue #112 may be closed, since it is more or less just the documentation of my investigation into the underlying issue.
The outcome - the changed Dockerfile above - is now documented as "Enhancement #115".

Microplayer

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
bug Something isn't working
Projects
None yet
Development

No branches or pull requests

1 participant