web-dev-qa-db-ja.com

ShapelyをAlpine Dockerにインストールする

プロジェクトをdockerに移動しようとしていますが、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はShaplyの依存関係です。テスト中はdocker-composerunserverコマンドを使用しているだけなので、Webサーバーを起動しようとするまですべてうまくいき、結果は

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 [].

今、私はいくつかの依存関係を削除したか、他のいくつかのライブラリをインストールする必要があると思います。いくつかグーグルしましたが、明らかにSudo apt-get install libgeos-c1をインストールする必要がありますが、Alpine/apkに相当するものが見つかりません

2
Amir Heshmati

私は同じ問題に苦労しました(DjangoおよびPostGresデータベースでは機能しません))。

最後に私はアミールの解決策でこれに対処することができました。 https://github.com/appropriate/docker-postgis/blob/master/Dockerfile.Alpine.template に従って、dl-cdn.alpinelinux.orgからリポジトリを追加しました。重要なのは、geos-devとgeosの実装後にgeos-configを実行することでした。この後、pythonモジュール(パンダを含む)をインストールしました。クリーンアップセクションでは、.build-depsはスキップされます。

これは、トリックを行った私のDockerfileの一部です。

 ... 
 RUN apk --update add build-base 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); print "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 requirements.txt 
 
 RUN apk del build-base python3-dev &&\
 rm -rf /var/cache/apk/*
。 .. 

ちなみに、私は https://github.com/calendar42/docker-python-geos/blob/master/Dockerfile で提供されているソリューションも試しました。しかし、これは私にはうまくいきませんでした。

3
mbarto

私は同じ問題に遭遇し、_apk add gcc_で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
_
1
silviot

現在geosはAlpine 3.11にあるようです。

FROM lsiobase/Alpine:3.11

私のために働くようです

0
Golda Velez