【问题标题】:How to locally debug dependencies in a lambda layer?如何在 lambda 层中本地调试依赖项?
【发布时间】:2020-08-22 12:01:01
【问题描述】:

我正在从一个 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 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

【问题讨论】:

  • 层中需要哪些包? opencv?
  • @Marcin 我需要以下库:opencv-python==3.4.3.18scipy==1.4.1scikit-learn==0.22.2.post1
  • 我创建了这样的图层,但是它太大了。我可以使用它的最低值约为 60MB,对于一层来说仍然太大(最大 50MB)。所以即使你解决了你的问题,你最终可能会得到一个巨大的层。

标签: python amazon-web-services docker aws-lambda aws-lambda-layers


【解决方案1】:

您遇到的问题是,当安装 opencv 时,它的依赖项不会安装到您的 -t 目标位置。它们将安装到 Docker 映像中的默认 pip 安装位置 &lt;somewhere&gt;/site-packages/

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

在您的 Docker 映像中调用 python -m site --user-site 以获取 pip 安装位置。

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

【讨论】:

    【解决方案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 加载命令地址/偏移未正确对齐”问题,

    这就是我最终的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
    

    【讨论】:

      猜你喜欢
      • 2016-02-04
      • 1970-01-01
      • 2020-09-07
      • 2022-10-16
      • 2015-04-09
      • 2017-07-18
      • 2017-05-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多