“找不到 jpeg 的头文件或库文件”在 Alpine Linux 上安装 Pillow

Posted

技术标签:

【中文标题】“找不到 jpeg 的头文件或库文件”在 Alpine Linux 上安装 Pillow【英文标题】:"The headers or library files could not be found for jpeg" installing Pillow on Alpine Linux 【发布时间】:2017-10-18 00:58:48 【问题描述】:

我正在尝试在基于python:alpine 的 Docker 容器中运行 Python 的 Scrapy。它以前可以工作,但现在我想使用 Scrapy 的 Image Pipeline,这需要我安装 Pillow。

作为一个简化的例子,我尝试了以下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

但是,当我尝试构建它时,我收到一个错误,其中包含以下内容:

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

我查看了https://pillow.readthedocs.io/en/latest/installation.html 上的要求并试图找到Alpine 的相应包,虽然我找不到libimagequant,所以这可能是“罪魁祸首”。尽管如此,回溯和错误消息似乎是说缺少jpeg,而我已经安装了openjpeg

如何修改Dockerfile 以便pip install Pillow 运行?

【问题讨论】:

只需添加:apk add jpeg-dev 【参考方案1】:

这对我有用

sudo apt-get install libjpeg-dev zlib1g-dev
pip install Pillow

【讨论】:

apt-get 在 Alpine Linux 上不存在,包管理器是 apk 即使在 Ubuntu 中 apt 现在也是最终用户的首选包管理器 askubuntu.com/a/446484 我只需要在 Ubuntu 20.04 上安装 libjpeg-dev 我在 Raspberry Pi 4b 上使用了这个答案,它有效 同样,在 Raspberry Pi 4b 上运行良好!非常感谢!【参考方案2】:

在稍后似乎已被删除的评论中,有人将我指向https://github.com/python-pillow/Pillow/blob/c05099f45c0d94a2a98c3609a96bdb6cf7446627/depends/alpine_Dockerfile。基于该 Dockerfile,我将自己的修改如下:

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

现在它构建成功了。

【讨论】:

仔细阅读错误后,我注意到“找不到 jpeg 的头文件或库文件”部分。这些标头保存在 *-dev 包中。所以我去了pkgs.alpinelinux.org/packages?name=libjpeg*&branch=edge,最后“apk --no-cache --update-cache add libjpeg-turbo-dev zlib-dev”成功了。 apk add jpeg-dev 是解决“找不到 jpeg 的标头或库文件”问题所需的全部内容 我使用了更少的 linux 包:FROM python:3.7-alpine RUN apk --update add gcc libgcc musl-dev jpeg-dev zlib-dev 构建速度更快,获取的二进制文件更少。【参考方案3】:

对于 macOS:

brew install libtiff libjpeg webp little-cms2

原因: https://pillow.readthedocs.io/en/latest/installation.html

【讨论】:

这让枕头对我有用!使用 Python 3.9 并通过示例第三版浏览 Django 3。 如果不同的 brew 前缀则使用 arch -arm64 brew install libtiff libjpeg webp little-cms2 我只需要 libjpeg。【参考方案4】:

我在使用 docker image python:3.6-alpine 时遇到了这个问题,我通过添加这些包 apk add jpeg-dev zlib-dev 解决了这个问题。

【讨论】:

【参考方案5】:

以防万一其他人仍然像我一样挣扎,您可以在此处查看 Pillow 的官方 alpine Dockerfile:https://github.com/python-pillow/docker-images/blob/master/alpine/Dockerfile#L20

它声明了以下依赖关系:

RUN apk --no-cache add python3 \

                   ...

                   # Pillow dependencies
                   jpeg-dev \
                   zlib-dev \
                   freetype-dev \
                   lcms2-dev \
                   openjpeg-dev \
                   tiff-dev \
                   tk-dev \
                   tcl-dev \
                   harfbuzz-dev \
                   fribidi-dev

【讨论】:

【参考方案6】:

你看过这个 QA 吗? Fail during installation of Pillow (Python module) in Linux

他们说你必须更新你的 pip 并安装 libjpeg-dev。

【讨论】:

他们没有提到基于 alpine 的解决方案:apk add jpeg-dev sudo dnf install libjpeg-turbo-devel libjpeg-turbo-utils 用于 Fedora 32 libjpeg-turbo-devel 为 redhat7 工作【参考方案7】:

简而言之,这会有所帮助:

RUN apt-get update -qq && apt-get install -y build-essential libsqlite3-dev \
  libpng-dev libjpeg-dev

详细说明:

我对@9​​87654322@ 图像有同样的错误。 @pierangelo-orizio 提出的解决方案对我有用,但我只是将其清理为所需的最少软件包列表。所以这是我的Dockerfile

FROM python:3.8-slim-buster

RUN apt-get update -qq && apt-get install -y build-essential libsqlite3-dev \
    libpng-dev libjpeg-dev

COPY requirements.txt .
RUN pip install --upgrade pip
RUN pip install -r requirements.txt

EXPOSE 8000
VOLUME /usr/src/app
WORKDIR /usr/src/app
CMD python manage.py runserver 0.0.0.0:8000

还有requirements.txt

Django>=2.1,<2.2
wagtail>=2.4,<2.5
django-cors-headers==2.5.3
python-dotenv==0.10.3

【讨论】:

【参考方案8】:

在 python 3.9 上遇到同样的问题。通过将 requirements.txt 中的枕头版本碰撞到 Pillow&gt;=8.0 来修复它。有一个很好的矩阵,哪个枕头版本支持哪个 python 版本here。

【讨论】:

【参考方案9】:

如果你在运行时缺少libjpeg.so 包,试试这个(alpine linux):

apk add --no-cache jpeg

【讨论】:

【参考方案10】:

您是否尝试创建一个 requirements.txt 并将其插入 Dockerfile:

    RUN apt-get update -qq && apt-get install build-essential g++ flex bison gperf ruby perl \
  mysql-client \
  libsqlite3-dev libmysqlclient-dev libfontconfig1-dev libicu-dev libfreetype6 libssl-dev \
  libpng-dev libjpeg-dev python libx11-dev libxext-dev -y
 ENV PYTHONUNBUFFERED 1
 RUN mkdir /code
 WORKDIR /code
 ADD requirements.txt /code/
 COPY . /code
 RUN pip install -r requirements.txt
 ADD . /code/

requirements.txt 示例

Django==1.9.7
django-appconf==1.0.1
django-filer==1.2.5
django-filter==0.15.0
django-grappelli==2.8.1
django-image-cropping==1.0.3
django-mptt==0.8.6
django-nested-admin==3.0.10
django-nested-inline==0.3.6
django-polymorphic==0.8.1
django-taggit==0.21.2
django-tinymce==2.4.0
dnspython==1.15.0
easy-thumbnails==2.3
enum34==1.1.2
funcsigs==0.4
idna==2.1
ipaddress==1.0.17
mercurial==3.7.3
mock==1.3.0
mysql-python
ndg-httpsclient==0.4.2
parsedatetime==2.1
pbr==1.8.0
Pillow==3.3.1
psutil==3.4.2
pyasn1==0.1.9
PyICU==1.9.2
pyOpenSSL==16.1.0
pyRFC3339==1.0
python-augeas==0.5.0
python-monkey-business==1.0.0
python2-pythondialog==3.3.0
pytz==2014.10
requests==2.11.1
six==1.10.0
Unidecode==0.4.19
urllib3==1.16
zope.component==4.2.2
zope.event==4.2.0
zope.hookable==4.0.4
zope.interface==4.1.3

【讨论】:

我想有很多多余的包(114Mb!)但它对我有用,谢谢!【参考方案11】:

只需将“RUN apk add jpeg-dev”添加到 Dockerfile 即可解决我的问题。

【讨论】:

以上是关于“找不到 jpeg 的头文件或库文件”在 Alpine Linux 上安装 Pillow的主要内容,如果未能解决你的问题,请参考以下文章

无法在 docker 容器中全局正确安装 npm 包

使用lua-resty-repl 调试openresty

Docker 基础镜像

Rod 在 Docker Alpine 中运行得到错误“chrome-linux/chrome:没有这样的文件或目录”

如何将 application.properties 传递给 Docker 容器中的 Spring Boot 应用程序?

分配的变量引用在哪里,在堆栈中还是在堆中?