问题描述
我正在从dockerfile创建一个lambda层,该文件将python软件包安装到目录并压缩结果。
FROM amazonlinux
workdir /
RUN yum update -y
# Install Python 3.7
RUN yum install python3 zip -y
RUN pip3.7 install --upgrade pip
# Install Python packages
RUN mkdir /packages
RUN echo "opencv-python" >> /packages/requirements.txt
RUN mkdir -p /packages/opencv-python-3.7/python/lib/python3.7/site-packages
RUN pip3.7 install -r /packages/requirements.txt -t /packages/opencv-python-3.7/python/lib/python3.7/site-packages
# Create zip files for Lambda Layer deployment
workdir /packages/opencv-python-3.7/
RUN zip -r9 /packages/cv2-python37.zip .
workdir /packages/
RUN rm -rf /packages/opencv-python-3.7/
对于此Dockerfile,我可以成功进行部署。
现在,我想添加更多的库¹,但是尽管docker构建和上传成功,但是执行lambda函数时仍然出现错误(找不到numpy)。
与更改Docker文件,构建,提取和上传zip文件并在AWS管理控制台中按“测试”相比,我希望有一种调试此问题的简便方法。
我尝试在本地运行docker容器,然后仅在此处安装软件包,看看是否可以在python shell中导入所有内容,但我什至无法以这种方式重新创建原始内容:
bash-4.2# pip3.7 install opencv-python
Collecting opencv-python
Using cached opencv_python-4.4.0.42-cp37-cp37m-manylinux2014_x86_64.whl (49.4 MB)
Collecting numpy>=1.14.5
Using cached numpy-1.19.1-cp37-cp37m-manylinux2010_x86_64.whl (14.5 MB)
Installing collected packages: numpy,opencv-python
Successfully installed numpy-1.19.1 opencv-python-4.4.0.42
bash-4.2# python3.7
Python 3.7.8 (default,Jul 24 2020,20:26:49)
[GCC 7.3.1 20180712 (Red Hat 7.3.1-9)] on linux
Type "help","copyright","credits" or "license" for more @R_415_4045@ion.
>>> import cv2
Traceback (most recent call last):
File "<stdin>",line 1,in <module>
File "/usr/local/lib64/python3.7/site-packages/cv2/__init__.py",line 5,in <module>
from .cv2 import *
ImportError: libGL.so.1: cannot open shared object file: No such file or directory
如何确定对本地计算机的正确依赖性?
更新
我使它可以使用以下版本,但是了解如何在本地进行测试仍然很有趣。
¹特别是我想要以下软件包:
opencv-python==3.4.3.18
scipy==1.4.1
scikit-learn==0.22.2.post1
解决方法
这里的问题是,安装opencv时,其依赖项不会安装到您的-t
目标位置。它们已安装到Docker映像中默认的pip安装位置<somewhere>/site-packages/
。
因此,当最终压缩目标位置时,会丢失所有依赖项。我可以通过 not 解决此问题,在安装opencv时提供pip目标。像安装其他任何软件包一样安装它。
从Docker映像调用python -m site --user-site
中获取pip安装位置。
修改Docker命令以在安装opencv之后将整个目录压缩,然后将其用于zip到Lambda。
,我能够通过以下方法使用symcbean@hal9000 $ php -q test2.php | xxd
00000000: 6172 7261 7920 280a 2020 276f 5f61 6464 array (. 'o_add
00000010: 7265 7373 2720 3d3e 2027 3434 2041 6263 ress' => '44 Abc
00000020: 2053 740a 4e59 430a 4e65 7720 596f 726b St.NYC.New York
00000030: 0a31 3030 3136 0a55 6e69 7465 6420 5374 .10016.United St
00000040: 6174 6573 272c 0a29 ates',.)
和scikit-learn
的最新版本,该方法可以自动执行部署过程,并通过删除不必要的文件{{1 }}:
我不得不同时打包cv2
和**/*.py[c|o],**/__pycache__*,**/*.dist-info*
,而打包的大小是一个很大的问题,最后我提出了以下解决方案。
在Serverless上使用cv2
软件包有助于我简化整个过程,并减小了软件包的大小。绝对会建议您检查一下。
This is the guide that I followed
Serverless python-requirements plugin
请确保将scipy
标志保留为serverless-python-requirements
,以避免剥离二进制文件,这会导致出现“ ELF加载命令地址/偏移未正确对齐”的问题,
这就是我最终的strip
的结果,它给了我想要将sklearn + cv2打包为一层的结果:
false
requirements.txt:
serverless.yml