Установка Shapely на док-станции Alpine
Я пытаюсь переместить свой проект в докер, и я использую альпийский вариант. Это проект Django с базой данных Postgres
Вот как я устанавливаю зависимости:
...
ADD ./requirements.txt /srv/sites/mysite/requirements.txt
RUN echo "http://mirror.leaseweb.com/alpine/edge/testing" >>
/etc/apk/repositories
RUN apk add --no-cache --virtual .build-deps \
build-base postgresql-dev libffi-dev gcc libc-dev linux-headers bash \
geos geos-dev jpeg-dev zlib-dev \
&& pip install -r requirements.txt \
&& find /usr/local \
\( -type d -a -name test -o -name tests \) \
-o \( -type f -a -name '*.pyc' -o -name '*.pyo' \) \
-exec rm -rf '{}' + \
&& runDeps="$( \
scanelf --needed --nobanner --recursive /usr/local \
| awk '{ gsub(/,/, "\nso:", $2); print "so:" $2 }' \
| sort -u \
| xargs -r apk info --installed \
| sort -u \
)" \
&& apk add --virtual .rundeps $runDeps \
&& apk del .build-deps
...
geos geos-dev
зависимость Шапли. все идет хорошо, пока я не попробую запустить веб-сервер, так как я тестирую, я просто использую runserver
командовать в docker-compose
и это приводит к
web_1_ba4690531efe | Traceback (most recent call last):
web_1_ba4690531efe | File "/srv/sites/mysite/manage.py", line 10, in <module>
web_1_ba4690531efe | execute_from_command_line(sys.argv)
web_1_ba4690531efe | File "/usr/local/lib/python3.6/site-packages/django/core/management/__init__.py", line 364, in execute_from_command_line
web_1_ba4690531efe | utility.execute()
web_1_ba4690531efe | File "/usr/local/lib/python3.6/site-packages/django/core/management/__init__.py", line 338, in execute
web_1_ba4690531efe | django.setup()
web_1_ba4690531efe | File "/usr/local/lib/python3.6/site-packages/django/__init__.py", line 27, in setup
web_1_ba4690531efe | apps.populate(settings.INSTALLED_APPS)
web_1_ba4690531efe | File "/usr/local/lib/python3.6/site-packages/django/apps/registry.py", line 108, in populate
web_1_ba4690531efe | app_config.import_models()
web_1_ba4690531efe | File "/usr/local/lib/python3.6/site-packages/django/apps/config.py", line 202, in import_models
web_1_ba4690531efe | self.models_module = import_module(models_module_name)
web_1_ba4690531efe | File "/usr/local/lib/python3.6/importlib/__init__.py", line 126, in import_module
web_1_ba4690531efe | return _bootstrap._gcd_import(name[level:], package, level)
web_1_ba4690531efe | File "<frozen importlib._bootstrap>", line 994, in _gcd_import
web_1_ba4690531efe | File "<frozen importlib._bootstrap>", line 971, in _find_and_load
web_1_ba4690531efe | File "<frozen importlib._bootstrap>", line 955, in _find_and_load_unlocked
web_1_ba4690531efe | File "<frozen importlib._bootstrap>", line 665, in _load_unlocked
web_1_ba4690531efe | File "<frozen importlib._bootstrap_external>", line 678, in exec_module
web_1_ba4690531efe | File "<frozen importlib._bootstrap>", line 219, in _call_with_frames_removed
web_1_ba4690531efe | File "/srv/sites/mysite/utils/models.py", line 5, in <module>
web_1_ba4690531efe | from utils.common_models import AbstractDetailedPerson, AbstractTimeStamped
web_1_ba4690531efe | File "/srv/sites/mysite/utils/common_models.py", line 5, in <module>
web_1_ba4690531efe | from utils.functions import national_id_validator
web_1_ba4690531efe | File "/srv/sites/mysite/utils/functions.py", line 16, in <module>
web_1_ba4690531efe | from shapely.geometry import Polygon, Point
web_1_ba4690531efe | File "/usr/local/lib/python3.6/site-packages/shapely/geometry/__init__.py", line 4, in <module>
web_1_ba4690531efe | from .base import CAP_STYLE, JOIN_STYLE
web_1_ba4690531efe | File "/usr/local/lib/python3.6/site-packages/shapely/geometry/base.py", line 17, in <module>
web_1_ba4690531efe | from shapely.coords import CoordinateSequence
web_1_ba4690531efe | File "/usr/local/lib/python3.6/site-packages/shapely/coords.py", line 8, in <module>
web_1_ba4690531efe | from shapely.geos import lgeos
web_1_ba4690531efe | File "/usr/local/lib/python3.6/site-packages/shapely/geos.py", line 76, in <module>
web_1_ba4690531efe | free = load_dll('c').free
web_1_ba4690531efe | File "/usr/local/lib/python3.6/site-packages/shapely/geos.py", line 56, in load_dll
web_1_ba4690531efe | libname, fallbacks or []))
web_1_ba4690531efe | OSError: Could not find lib c or load any of its variants [].
теперь я предполагаю, что либо я удалил некоторую зависимость, либо мне нужно установить некоторые другие библиотеки. Сделал поиск в Google и, видимо, мне нужно установить sudo apt-get install libgeos-c1
но я не могу найти alpine/apk
эквивалент
3 ответа
Я боролся с той же проблемой (хотя не работал с базами данных Django и PostGres).
Наконец мне удалось решить это с помощью решения Амира. Я добавил репозитории из dl-cdn.alpinelinux.org в соответствии с https://github.com/appropriate/docker-postgis/blob/master/Dockerfile.alpine.template. Важнейшей частью был запуск geos-config после реализации geos-dev и geos. После этого я установил модули python, включая панд. В разделе очистки.build-deps пропущен, как сказано.
Это часть моего Dockerfile, которая добилась цели:
... RUN apk --update добавить базу сборки libxslt-dev RUN apk add --virtual.build-deps \ --repository http://dl-cdn.alpinelinux.org/alpine/edge/testing \ --repository http://dl-cdn.alpinelinux.org/alpine/edge/main \ gcc libc-dev geos-dev geos && \ runDeps = "$ (scanelf --needed --nobanner --recursive / usr / local \ | awk '{gsub (/, /, "\ nso:", $ 2); выведите "so:" $ 2} '\ | xargs -r apk info --installed \ | sort -u) "&& \ apk add --virtual.rundeps $ runDeps RUN geos-config --cflags RUN pip install --disable-pip-version-check -r needs.txt RUN apk del build-base python3-dev && \ rm -rf / var / cache / apk / *...
Кстати, я также попробовал решение, представленное на https://github.com/calendar42/docker-python-geos/blob/master/Dockerfile. Но это не сработало для меня.
Я столкнулся с той же проблемой и решил ее, установив gcc с apk add gcc
,
При ближайшем рассмотрении проблема вызвана этой ошибкой в альпийском изображении.
Возможный (довольно хакерский) обходной путь (помимо установки gcc, который довольно тяжелый) - это исправить файл /sbin/ldconfig
замена первой строки
#!/bin/sh
if [ "$1" = "-p" ]; then
# Hack to mimic GNU ldconfig s -p option, needed by ctypes, used by shapely
echo " libc.musl-x86_64.so.1 (libc6,x86-64) => /lib/libc.musl-x86_64.so.1"
exit 0
fi
Похоже, сейчас geos в alpine 3.11, пробую
FROM lsiobase/alpine:3.11
похоже работает для меня
Это было решено удалением раздела очистки файла Dockerfile, но после компиляции я обнаружил ошибку pandas
>>> import pandas
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/usr/local/lib/python3.6/site-packages/pandas/__init__.py", line 26, in <module>
from pandas._libs import (hashtable as _hashtable,
File "/usr/local/lib/python3.6/site-packages/pandas/_libs/__init__.py", line 4, in <module>
from .tslib import iNaT, NaT, Timestamp, Timedelta, OutOfBoundsDatetime
File "__init__.pxd", line 872, in init pandas._libs.tslib
ValueError: numpy.ufunc has the wrong size, try recompiling. Expected 192, got 216
так что я перешел на тонкий вариант и все прошло хорошо.