Har*_*hIT 6 amazon-web-services python-3.x docker aws-lambda
我想在 AWS Lambda 函数上将机器学习相关代码部署为 Docker 映像。AWS 为 Python 提供的基础映像,不允许使用 apt-get 命令安装。因此,我为 AWS Lambda 创建了自定义 docker 镜像。下面是我的 Dockerfile 的代码。
参考:从替代基本图像创建图像
ARG FUNCTION_DIR="/function"
FROM python:3.7-buster as build-image
# 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 python-opencv
# Include global arg in this stage of the build
ARG FUNCTION_DIR
# Create function directory
RUN mkdir -p ${FUNCTION_DIR}
# Install the runtime interface client
RUN pip install \
--target ${FUNCTION_DIR} \
awslambdaric
FROM python:3.7-buster
ARG FUNCTION_DIR
# Set working directory to function root directory
WORKDIR ${FUNCTION_DIR}
# Copy in the build image dependencies
COPY --from=build-image ${FUNCTION_DIR} ${FUNCTION_DIR}
COPY requirements.txt /
#RUN pip install -r /requirements.txt
COPY . /function
ENV AWS_LAMBDA_RUNTIME_API=python3.7
ENTRYPOINT [ "/usr/local/bin/python", "-m", "awslambdaric" ]
CMD [ "app.handler" ]
Run Code Online (Sandbox Code Playgroud)
我的文件夹结构如下:
aws_lambda (Folder)
- Dockerfile
- app.py
- function (Folder)
- app.py
- requirements.txt
Run Code Online (Sandbox Code Playgroud)
当我运行 docker image 时,它显示错误如下:
[ERROR] [1614258613176] LAMBDA_RUNTIME Failed to get next invocation. No Response from endpoint
Traceback (most recent call last):
File "/usr/local/lib/python3.7/runpy.py", line 193, in _run_module_as_main
"__main__", mod_spec)
File "/usr/local/lib/python3.7/runpy.py", line 85, in _run_code
exec(code, run_globals)
File "/function/awslambdaric/__main__.py", line 21, in <module>
main(sys.argv)
File "/function/awslambdaric/__main__.py", line 17, in main
bootstrap.run(app_root, handler, lambda_runtime_api_addr)
File "/function/awslambdaric/bootstrap.py", line 416, in run
event_request = lambda_runtime_client.wait_next_invocation()
File "/function/awslambdaric/lambda_runtime_client.py", line 76, in wait_next_invocation
response_body, headers = runtime_client.next()
RuntimeError: Failed to get next
Executing 'app.handler' in function directory '/function'
Run Code Online (Sandbox Code Playgroud)
似乎无法找到 /function 目录,但它已经在那里了。
我最近遇到了这件事,这对我有用。
我的泊坞窗文件:
ARG FUNCTION_DIR="/opt/myapp"
FROM ubuntu:16.04
RUN apt update \
&& apt upgrade \
&& apt-get install -y software-properties-common python-software-properties \
&& apt-add-repository -y ppa:deadsnakes/ppa \
&& apt update \
&& apt-get install -y python3.6 python3.6-dev python3-pip
RUN python3.6 -m pip --no-cache-dir install awslambdaric
ADD https://github.com/aws/aws-lambda-runtime-interface-emulator/releases/latest/download/aws-lambda-rie /usr/bin/aws-lambda-rie
ARG FUNCTION_DIR
RUN mkdir -p ${FUNCTION_DIR}
WORKDIR /opt
ADD myapp myapp
COPY entry.sh /opt/myapp/entry.sh
RUN chmod 755 /usr/bin/aws-lambda-rie /opt/myapp/entry.sh
WORKDIR /tmp
ENTRYPOINT [ "/opt/myapp/entry.sh" ]
CMD [ "/opt/myapp/app.handler" ]
Run Code Online (Sandbox Code Playgroud)
我的入口点
#!/bin/sh
if [ -z "${AWS_LAMBDA_RUNTIME_API}" ]; then
exec /usr/bin/aws-lambda-rie /usr/bin/python3.6 -m awslambdaric $1
else
exec /usr/bin/python3.6 -m awslambdaric $1
fi
Run Code Online (Sandbox Code Playgroud)
然后我用以下方法构建了我的图像:
docker build --rm -t myimage 。
并在本地运行测试:
docker run -p 9000:8080 --rm -it myimage:最新
在另一个终端我运行:
卷曲-XPOST“http://localhost:9000/2015-03-31/functions/function/invoices”-d'{“field1”:“..”,“field2”:“..”}'
详细阐述开始。我app.py包含一个方法handler,它解析参数事件并检索字段(您可以在curl调用中看到它们),然后开始详细说明。我设置了工作目录,/tmp因为它是 AWS Lambda 中唯一的读/写文件夹,因此我可以将我的阐述的一些中间文件放在那里。
| 归档时间: |
|
| 查看次数: |
8775 次 |
| 最近记录: |