如何在lambda层中本地调试依赖项?

2024-05-28 18:15:03 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在从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管理控制台中按“test”更简单的调试方法

我尝试在本地运行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 information.
>>> 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

Tags: install文件lambdarunnumpypackagessitezip
2条回答

我能够通过以下方法使用scikit-learncv2的最新版本,从而自动化部署过程,并通过删除不必要的文件**/*.py[c|o], **/__pycache__*, **/*.dist-info*自动减小包的大小:

我必须打包cv2scipy,在这两种情况下,包的大小是一个巨大的问题,最后我找到了以下解决方案

Serverless上使用serverless-python-requirements包有助于我简化整个过程并减小包的大小。我绝对建议你去看看

This is the guide that I followed

Serverless python-requirements plugin

确保将strip标志保留为false,以避免剥离二进制文件,从而导致“ELF load命令地址/偏移量未正确对齐”的问题

这就是我最后的serverless.yml,它给了我想要将sklearn+cv2打包为一个层的结果:

custom:
  pythonRequirements:
    dockerizePip: true
    useDownloadCache: true
    useStaticCache: false
    slim: true
    strip: false
    layer:
      name: ${self:provider.stage}-cv2-sklearn
      description: Python requirements lambda layer
      compatibleRuntimes:
        - python3.8
      allowedAccounts:
        - '*'

requirements.txt:

opencv-python-headless==4.4.0.42
scikit-learn==0.23.2

这里的问题是,当安装opencv时,它的依赖项不会安装到-t目标位置。它们将被安装到Docker映像中的默认pip安装位置<somewhere>/site-packages/

因此,当您压缩目标位置时,您将丢失所有依赖项。我将通过而不是在安装opencv时为pip提供一个目标来解决这个问题。像安装任何其他软件包一样安装它

从Docker映像内调用python -m site user-site以获取pip安装位置

在安装opencv后,修改Docker命令以压缩整个目录,然后将其用于压缩到Lambda

相关问题 更多 >

    热门问题