Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

"The headers or library files could not be found for jpeg" installing Pillow on Alpine Linux

I'm trying to run Python's Scrapy in a Docker container based on python:alpine. It was working before, but now I'd like to use Scrapy's Image Pipeline which requires me to install Pillow.

As a simplified example, I tried the following Dockerfile:

FROM python:alpine RUN apk --update add libxml2-dev libxslt-dev libffi-dev gcc musl-dev libgcc openssl-dev curl RUN apk add libjpeg zlib tiff freetype lcms libwebp tcl openjpeg RUN pip install Pillow 

However, when I try to build this I get an error which contains the following:

Traceback (most recent call last):   File "/tmp/pip-build-ft5yzzuv/Pillow/setup.py", line 744, in <module>     zip_safe=not debug_build(), )   File "/usr/local/lib/python3.6/distutils/core.py", line 148, in setup     dist.run_commands()   File "/usr/local/lib/python3.6/distutils/dist.py", line 955, in run_commands     self.run_command(cmd)   File "/usr/local/lib/python3.6/distutils/dist.py", line 974, in run_command     cmd_obj.run()   File "/usr/local/lib/python3.6/site-packages/setuptools/command/install.py", line 61, in run     return orig.install.run(self)   File "/usr/local/lib/python3.6/distutils/command/install.py", line 545, in run     self.run_command('build')   File "/usr/local/lib/python3.6/distutils/cmd.py", line 313, in run_command     self.distribution.run_command(command)   File "/usr/local/lib/python3.6/distutils/dist.py", line 974, in run_command     cmd_obj.run()   File "/usr/local/lib/python3.6/distutils/command/build.py", line 135, in run     self.run_command(cmd_name)   File "/usr/local/lib/python3.6/distutils/cmd.py", line 313, in run_command     self.distribution.run_command(command)   File "/usr/local/lib/python3.6/distutils/dist.py", line 974, in run_command     cmd_obj.run()   File "/usr/local/lib/python3.6/distutils/command/build_ext.py", line 339, in run     self.build_extensions()   File "/tmp/pip-build-ft5yzzuv/Pillow/setup.py", line 545, in build_extensions     raise RequiredDependencyException(f) __main__.RequiredDependencyException: jpeg  During handling of the above exception, another exception occurred:  Traceback (most recent call last):   File "<string>", line 1, in <module>   File "/tmp/pip-build-ft5yzzuv/Pillow/setup.py", line 756, in <module>     raise RequiredDependencyException(msg) __main__.RequiredDependencyException:  The headers or library files could not be found for jpeg, a required dependency when compiling Pillow from source.  Please see the install instructions at:    https://pillow.readthedocs.io/en/latest/installation.html 

I went through the requirements on https://pillow.readthedocs.io/en/latest/installation.html and tried to find the corresponding packages for Alpine, although one I couldn't find was libimagequant, so this might be the 'culprit'. Nonetheless, it the traceback and error message seem to be saying that jpeg is missing, whereas I have installed openjpeg.

How can I modify the Dockerfile so that pip install Pillow runs?

like image 508
Kurt Peek Avatar asked May 18 '17 09:05

Kurt Peek


Video Answer


2 Answers

This worked for me

sudo apt-get install libjpeg-dev zlib1g-dev pip install Pillow 
like image 171
vamsi Avatar answered Sep 21 '22 04:09

vamsi


In a comment that appears to have been deleted later, someone pointed me to https://github.com/python-pillow/Pillow/blob/c05099f45c0d94a2a98c3609a96bdb6cf7446627/depends/alpine_Dockerfile. Based on that Dockerfile I modified my own as follows:

FROM python:alpine RUN apk --update add libxml2-dev libxslt-dev libffi-dev gcc musl-dev libgcc openssl-dev curl RUN apk add jpeg-dev zlib-dev freetype-dev lcms2-dev openjpeg-dev tiff-dev tk-dev tcl-dev RUN pip install Pillow 

Now it builds successfully.

like image 22
Kurt Peek Avatar answered Sep 23 '22 04:09

Kurt Peek