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?
This worked for me
sudo apt-get install libjpeg-dev zlib1g-dev pip install Pillow 
                        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.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With