python-3.x - AWS Lambda 容器映像中的 OpenCV
问题描述
我正在尝试构建一个 docker 映像,它将作为 AWS Lambda 上的一个函数进行部署。能够成功构建和测试图像,但是当我尝试在函数中导入 OpenCV 时遇到问题。
当我从 app.py 中删除 import 语句时,我没有遇到这个问题
我面临的错误 -
{"errorMessage": "Unable to import module 'app': libGL.so.1: cannot open shared object file: No such file or directory", "errorType": "Runtime.ImportModuleError"}
我的 Dockerfile -
# Define custom function directory
ARG FUNCTION_DIR="/function"
FROM python:3.9 as build-image
# Include global arg in this stage of the build
ARG FUNCTION_DIR
# Install aws-lambda-cpp build dependencies
RUN apt-get update && \
apt-get install -y \
g++ \
make \
cmake \
unzip \
libcurl4-openssl-dev
RUN apt-get install -y --fix-missing \
build-essential \
cmake \
gfortran \
git \
wget \
curl \
graphicsmagick \
libgraphicsmagick1-dev \
libatlas-base-dev \
libavcodec-dev \
libavformat-dev \
libgtk2.0-dev \
libjpeg-dev \
liblapack-dev \
libswscale-dev \
pkg-config \
python3-dev \
python3-numpy \
software-properties-common \
zip \
&& apt-get clean && rm -rf /tmp/* /var/tmp/*
# Copy function code
RUN mkdir -p ${FUNCTION_DIR}
COPY app/* ${FUNCTION_DIR}
WORKDIR ${FUNCTION_DIR}
RUN pip install -r requirements.txt --target ${FUNCTION_DIR}
# Install the function's dependencies
RUN pip install \
--target ${FUNCTION_DIR} \
awslambdaric
FROM python:3.9
# Include global arg in this stage of the build
ARG FUNCTION_DIR
# Set working directory to function root directory
WORKDIR ${FUNCTION_DIR}
# Copy in the built dependencies
COPY --from=build-image ${FUNCTION_DIR} ${FUNCTION_DIR}
ENTRYPOINT [ "/usr/local/bin/python", "-m", "awslambdaric" ]
CMD [ "app.handler" ]
我的要求.txt -
mediapipe<=0.8.3.1
numpy<=1.19.4
opencv-python<=4.4.0.46
boto3<=1.17.64
我的应用程序.py
import cv2
def handler(event, context):
return cv2.__version__
解决方案
我在尝试使用媒体管道容器时遇到了同样的问题,得到了同样的错误。pip 安装 python-opencv-headless 为我解决了这个问题,我不需要安装任何额外的依赖项。
FROM public.ecr.aws/lambda/python:3.8
# Copy function code
COPY app.py ${LAMBDA_TASK_ROOT}
# Install the function's dependencies using file requirements.txt
# from your project folder.
COPY requirements.txt .
RUN pip3 install mediapipe opencv-python-headless --target "${LAMBDA_TASK_ROOT}"
# Set the CMD to your handler (could also be done as a parameter override outside of the Dockerfile)
CMD [ "app.handler" ]
推荐阅读
- php - PHP:简单的 DOM 解析器如何迭代 html 代码
- ms-word - 使用 Word VSTO 或 WordOpenXML 从范围获取本地样式名称的最快方法是什么
- javascript - 在反应中一个接一个地运行功能
- ios - 从 JSON 数组更新表,但按字母顺序排序会导致 Swift 3 中的错误
- node.js - 如何在 Sequelize ORM 中获取不带前缀表名的连接数据结果
- ruby-on-rails - 如何使用 fb meta og 标签分享帖子描述
- google-maps - 在谷歌地图中找不到地点 ID
- python - Jupyter笔记本;无法使用 Jupyter 笔记本上未显示的列
- amazon-web-services - 将 jpostal/libpostal 部署到 EC2 实例中
- android - 如何在android中保存文本视图?