bến tàu, núi cao và matplotlib


11

Tôi hiện đang cố gắng thu nhỏ một trong những hình ảnh docker của chúng tôi bằng alpine:

FROM python:2.7-alpine

Tuy nhiên, tôi gặp sự cố khi cài đặt matplotlib.h:

EOF
warning: no previously-included files matching '*.pyo' found anywhere in distribution
warning: no previously-included files matching '*.pyd' found anywhere in distribution
numpy/core/src/multiarray/numpyos.c:18:21: fatal error: xlocale.h: No such file or directory
compilation terminated.
numpy/core/src/multiarray/numpyos.c:18:21: fatal error: xlocale.h: No such file or directory
compilation terminated.
Traceback (most recent call last):
  File "<string>", line 1, in <module>
  File "/tmp/pip-build-kCID_8/matplotlib/setup.py", line 383, in <module>
    **extra_args
  File "/usr/local/lib/python2.7/distutils/core.py", line 111, in setup
    _setup_distribution = dist = klass(attrs)
  File "/usr/local/lib/python2.7/site-packages/setuptools/dist.py", line 269, in __init__
    self.fetch_build_eggs(attrs['setup_requires'])
  File "/usr/local/lib/python2.7/site-packages/setuptools/dist.py", line 313, in fetch_build_eggs
    replace_conflicting=True,
  File "/usr/local/lib/python2.7/site-packages/pkg_resources/__init__.py", line 826, in resolve
    dist = best[req.key] = env.best_match(req, ws, installer)
  File "/usr/local/lib/python2.7/site-packages/pkg_resources/__init__.py", line 1071, in best_match
    return self.obtain(req, installer)
  File "/usr/local/lib/python2.7/site-packages/pkg_resources/__init__.py", line 1083, in obtain
    return installer(requirement)
  File "/usr/local/lib/python2.7/site-packages/setuptools/dist.py", line 380, in fetch_build_egg
    return cmd.easy_install(req)
  File "/usr/local/lib/python2.7/site-packages/setuptools/command/easy_install.py", line 640, in easy_install
    return self.install_item(spec, dist.location, tmpdir, deps)
  File "/usr/local/lib/python2.7/site-packages/setuptools/command/easy_install.py", line 670, in install_item
    dists = self.install_eggs(spec, download, tmpdir)
  File "/usr/local/lib/python2.7/site-packages/setuptools/command/easy_install.py", line 850, in install_eggs
    return self.build_and_install(setup_script, setup_base)
  File "/usr/local/lib/python2.7/site-packages/setuptools/command/easy_install.py", line 1078, in build_and_install
    self.run_setup(setup_script, setup_base, args)
  File "/usr/local/lib/python2.7/site-packages/setuptools/command/easy_install.py", line 1066, in run_setup
    raise DistutilsError("Setup script exited with %s" % (v.args[0],))
distutils.errors.DistutilsError: Setup script exited with error: Command "gcc -fno-strict-aliasing -g -O2 -DNDEBUG -g -fwrapv -O3 -Wall -Wstrict-prototypes -fPIC -DHAVE_NPY_CONFIG_H=1 -D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE=1 -D_LARGEFILE64_SOURCE=1 -DHAVE_CBLAS -Ibuild/src.linux-x86_64-2.7/numpy/core/src/private -Inumpy/core/include -Ibuild/src.linux-x86_64-2.7/numpy/core/include/numpy -Inumpy/core/src/private -Inumpy/core/src -Inumpy/core -Inumpy/core/src/npymath -Inumpy/core/src/multiarray -Inumpy/core/src/umath -Inumpy/core/src/npysort -I/usr/local/include/python2.7 -Ibuild/src.linux-x86_64-2.7/numpy/core/src/private -Ibuild/src.linux-x86_64-2.7/numpy/core/src/private -Ibuild/src.linux-x86_64-2.7/numpy/core/src/private -c numpy/core/src/multiarray/numpyos.c -o build/temp.linux-x86_64-2.7/numpy/core/src/multiarray/numpyos.o" failed with exit status 1

Tôi nhận ra điều này có lẽ là do musl.

Dưới đây là các bit có liên quan của tôi Dockerfile:

# xmlsec is only available in the testing repo
RUN apk add --no-cache --virtual .build-deps \
  xmlsec \
  xmlsec-dev \
  py-numpy \
  py-numpy-dev \
  --repository http://dl-3.alpinelinux.org/alpine/edge/testing/ \
  --allow-untrusted

RUN apk add --no-cache --virtual .build-deps \
  build-base \
  postgresql-dev \
  libffi-dev \
  nodejs \
  swig \
  git \
  libpng-dev \
  freetype-dev \
  libxml2-dev \
  libxslt-dev \
  python-dev \
  musl-dev \
  tk-dev \
  gfortran \
  py-setuptools \
  netcat-openbsd

RUN pip install -r requirements.txt

Đây là yêu cầu của tôi.txt:

setuptools==19.7
alabaster==0.7.4
amqp==1.4.6
anyjson==0.3.3
authy==2.1.2
awscli==1.9.12
Babel==1.3
backports.ssl-match-hostname==3.4.0.2
blessings==1.6
boto==2.9.9
certifi==2015.4.28
click==4.0
cryptography==1.0.1
Django==1.8.2
django-oauth-toolkit==0.8.1
django-appconf==1.0.1
django-compressor==1.5
django-cors-headers==1.1.0
django-coverage==1.2.4
django-crispy-forms==1.5.2
django-crontab==0.6.0
django-debug-panel==0.8.1
django-debug-toolbar==1.3.0
django-easy-pdf==0.1.0
django-email-extras==0.3.1
django-filter==0.10.0
django-forms-builder==0.11.1
django-libsass==0.3
django-markdown-deux==1.0.5
django-model-utils==2.2
django-nose==1.4
django-pgjson==0.3.1
django-phonenumber-field==0.7.2
django-pickling==0.1
django-ratelimit==0.6.0
django-redis==4.0.0
djangorestframework==3.3.1
djangorestframework-csv==1.3.4
django-rq==0.7.0
django-s3-cache==1.4.2
django-sphinx==2.2.4
django-storages==1.1.8
django-templatetag-handlebars==1.3.0
django-timedeltafield==0.7.10
django-twilio==0.8.0
docutils==0.12
ecdsa==0.11
extras==0.0.3
factory-boy==2.5.2
fake-factory==0.5.1
flex==4.3.0
functools32==3.2.3-1
gdata==2.0.18
gnureadline==6.3.3
greenlet==0.4.7
gunicorn==19.3.0
html5lib==0.999
httplib2==0.9.1
httpretty==0.8.10
inflection==0.3.1
ipdb==0.8
ipython==3.1.0
Jinja2==2.7.3
jsonschema==2.5.1
libsass==0.8.2
linecache2==1.0.0
lockfile==0.9.1
lxml==3.4.4
matplotlib==1.5.0
mimeparse==0.1.3
mistune==0.6
mock==1.3.0
newrelic==2.50.0.39
nose==1.3.6
nose-progressive==1.5.1
numpy==1.9.2
oauth2client==1.4.11
oauthlib==0.7.2
pandas==0.16.1
paramiko==1.15.2
pbr==1.0.1
pep8==1.6.2
phonenumbers==7.0.9
Pillow==2.8.1
pipdeptree==0.4.2
progressbar33==2.4
psycopg2==2.5.5
ptyprocess==0.5
pyasn1==0.1.7
pyasn1-modules==0.0.5
pycrypto==2.6.1
Pygments==2.0.2
PyJWT==1.3.0
pyOpenSSL==0.13
PyPDF2==1.24
python-daemon==1.6
python-dateutil==2.4.2
python-gnupg==0.3.7
python-logstash==0.4.6
python-memcached==1.54
python-mimeparse==0.1.4
python-openid==2.2.5
python-saml==2.1.3
python-social-auth==0.2.12
pytz==2015.4
PyYAML==3.11
pyzmq==14.6.0
raven==5.5.0
redis==2.10.3
reportlab==3.1.44
requests==2.7.0
requests-oauthlib==0.5.0
rq==0.5.2
rq-scheduler==0.5.1
rsa==3.1.4
simplejson==3.7.2
six==1.10.0
soaplib==2.0.0-beta2
sorl-thumbnail==12.2
Sphinx==1.3.1
sphinx-me==0.3
sqlparse==0.1.15
ssh==1.8.0
stripe==1.27.1
suds==0.4
terminado==0.5
testtools==1.8.0
traceback2==1.4.0
Unidecode==0.4.17
unittest2==1.0.1
uritemplate==0.6
vobject==0.6.6
Werkzeug==0.9.6
whitenoise==1.0.6
xhtml2pdf==0.0.6
django-absoluteuri==1.1.0

Tôi cần làm gì để cài đặt nó?

Câu trả lời:


13

Tôi đã giải quyết vấn đề này bằng cách thêm:

RUN ln -s /usr/include/locale.h /usr/include/xlocale.h

Tất cả mọi thứ có thể cài đặt đúng. Nhưng tôi không chắc đó là thực hành tốt.


Tôi hiểu bạn đến từ đâu - nhưng tôi cảm thấy tốt hơn rất nhiều khi có thể mã hóa điều này trong Dockerfile của tôi (với một liên kết thích hợp quay lại bài đăng chính xác này trong một bình luận). Docker, bất chấp những chỉ trích của nó, khá ấn tượng một phần vì những thứ như thế này.
lol

Điều này cũng làm việc cho Cygwin. Numpy chỉ cố gắng tải xlocale.h nếu có sẵn và vì một số lý do, nó nghĩ rằng nó có sẵn ở Cygwin ở mọi nơi, nhưng nó không phụ thuộc vào khả năng đặc biệt của xlocale.h.
CMCDragonkai

Cung cấp những gì /usr/include/locale.h? Tôi đang sử dụng hình ảnh trên núi cao và đã cài đặt make python gcc libffi-dev linux-headers libgcc libstdc++tuy nhiên tệp cần thiết không có ở đó để liên kết ở vị trí đầu tiên
MikeM

@ MichaelMügge Đó là musl-devgói
Céline Aussourd

2

Bạn có thể cần phải sử dụng một hình ảnh docker Linux alpine sử dụng glibcvà thay thế musl-devbằng glibc-headers, vì các tệp tiêu đề bị thiếu được gói vào glibc-headers.

Tất cả các kết quả hàng đầu trong Docker Hub khi bạn tìm kiếm glibchình ảnh docker linux alpine được kích hoạt sử dụng cùng một nguồn cho glibccác gói APK.

Bản dựng đó không bao gồm các tiêu đề, nhưng có thể được điều chỉnh để làm như vậy bằng cách bao gồm một gói con khác với các tệp bị thiếu, một cái gì đó dọc theo dòng (chưa được kiểm tra):

headers() {
  mkdir -p "$subpkgdir"/usr/glibc-compat
  cp -a "$srcdir"/usr/glibc-compat/include "$subpkgdir"/usr/glibc-compat
}

trong tệp APKBUILD .

Đã nghiên cứu điều này, tôi đặt câu hỏi về tính hữu ích của việc có các tiêu đề trong thùng chứa cuối cùng của bạn. Đối với tôi, có vẻ hữu ích hơn nhiều khi có một thùng chứa trung gian để xây dựng sự phụ thuộc yêu cầu các tiêu đề, nếu có thể, và cài đặt gói kết quả trong thùng chứa của bạn.


Hrmm, điều này đã không làm việc cho tôi. Tôi nhận được cùng một lỗi về xlocale.h. Tôi thấy rằng musl-devdù sao nó cũng đã cài đặt , một trong những gói đó dường như yêu cầu nó. libc-devcài đặt quá, như tôi có thể nói.
synic

Bạn có thể chia sẻ requirements.txt(hoặc phần có liên quan kích hoạt bản dựng thực sự yêu cầu matplotlib.h), để sao chép địa phương đó không?
dawud

Ok, tôi đã thêm nó vào OP
synic

Sau một nghiên cứu nhỏ, nó đòi hỏi một lượng thời gian không hề nhỏ để cung cấp giải pháp làm việc, tôi đã cố gắng phác thảo các yêu cầu và tại sao các tệp tiêu đề không có ở đó. Tôi để nó cho bạn để điền vào chỗ trống. Tuy nhiên, hy vọng nó hữu ích.
dawud

2

Những phụ thuộc này làm việc cho tôi: docker run -c 'apk update && apk add g++ make subversion gcc gfortran ca-certificates python3-dev libpng-dev freetype-dev python3; ln -s /usr/include/locale.h /usr/include/xlocale.h; python3 -m pip install matplotlib'

Thay thế python3bằng pythonnếu bạn muốn 2.7

(ngoài câu trả lời của @ Celine)

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.