【发布时间】:2021-11-23 20:49:18
【问题描述】:
我有基于 Alpine linux 的 Dockerfile,它为 AWS Lambda 构建 lambda.zip 文件。 这是 Dockerfile:
FROM alpine:3.12
# -- Install OS packages:
RUN apk add gcc
RUN apk add --update --no-cache \
bash \
build-base \
cargo \
curl \
docker \
# gcc \
git \
g++ \
lftp \
libc-dev \
libffi-dev \
libsodium-dev \
libxslt-dev\
libzmq \
zeromq-dev \
make \
musl-dev \
ncftp \
nodejs \
npm \
openssh-client \
openssl \
openssl-dev \
rsync \
su-exec \
tar \
wget \
zip
# geos \
# geos-dev \
# libc-dev
WORKDIR /tmp/
RUN echo "http://mirror.leaseweb.com/alpine/edge/community" >> /etc/apk/repositories
RUN echo "http://dl-cdn.alpinelinux.org/alpine/edge/community" >> /etc/apk/repositories
RUN apk add --virtual .build-deps \
--repository http://dl-cdn.alpinelinux.org/alpine/edge/community \
--repository http://dl-cdn.alpinelinux.org/alpine/edge/main \
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
# -- Install python:
RUN apk add --update --no-cache python3-dev python3 \
&& python3 -m ensurepip --upgrade \
&& pip3 install --upgrade pip pipenv setuptools docker-compose awscli shapely wheel \
&& rm -r /usr/lib/python*/ensurepip \
&& if [ ! -e /usr/bin/pip ]; then ln -s pip3 /usr/bin/pip ; fi \
&& if [[ ! -e /usr/bin/python ]]; then ln
这是适用于 docker Alpine 映像并构建 lambda.zip 的脚本,其中包含 python 文件和所有需要的依赖项,如 boto3、pip、6 等。
#!/bin/bash
set -x
set -e
pipenv install
rm -rf lambda.zip
VENV=$(pipenv --venv)
TEMPDIR=$(mktemp -d)
rsync -r --progress ./* ${TEMPDIR}
rsync -r --progress ${VENV}/lib/python3.8/site-packages/* ${TEMPDIR}
pushd ${TEMPDIR}
zip -r lambda.zip ./*
popd
cp ${TEMPDIR}/lambda.zip ./
cleanup() {
rm -rf ${TEMPDIR}
}
trap cleanup EXIT
然后我将这个 lambda.zip 复制到我的本地机器,解压缩并在我的本地机器上启用 pipenv 以仅使用 lambda.zip 中的包,然后我尝试测试 Shapely 包,例如 test.py:
from shapely.geometry import Polygon
print(Polygon([[0, 0], [1, 0], [1, 1], [0, 1], [0, 0]]).minimum_clearance)
在 AWS lambda 和我的本地机器上,我在 geos_c 之后遇到了同样的错误:
Traceback (most recent call last):
File "test.py", line 1, in <module>
from shapely.geometry import Polygon
File "/home/stark/code/job/lamba_python_312_stack/shapely/geometry/__init__.py", line 4, in <module>
from .base import CAP_STYLE, JOIN_STYLE
File "/home/stark/code/job/lamba_python_312_stack/shapely/geometry/base.py", line 19, in <module>
from shapely.coords import CoordinateSequence
File "/home/stark/code/job/lamba_python_312_stack/shapely/coords.py", line 8, in <module>
from shapely.geos import lgeos
File "/home/stark/code/job/lamba_python_312_stack/shapely/geos.py", line 87, in <module>
_lgeos = load_dll('geos_c', fallbacks=alt_paths)
File "/home/stark/code/job/lamba_python_312_stack/shapely/geos.py", line 60, in load_dll
raise OSError(
OSError: Could not find lib geos_c or load any of its variants ['libgeos_c.so.1', 'libgeos_c.so'].
如果我解压缩文件,我会得到如下内容:
@user# ls
iohttp
aiohttp-3.7.4.post0.dist-info
attr
attrs-21.2.0.dist-info
boto3
boto3-1.18.38.dist-info
botocore
cron_runner.py
setuptools-58.0.4.virtualenv
shapely
Shapely-1.7.1.dist-info
...
xmltodict.py
yarl
yarl-1.6.3.dist-info
我在 Internet 上尝试了很多不同的解决方案,因此您可以在我的 Dockerfile 中看到一团糟,但它们都不起作用。
【问题讨论】:
标签: python docker aws-lambda alpine shapely