有没有一种方法可以使用 AWS SAM 增量构建容器镜像?

Is there a way to incrementally build container images with AWS SAM?

我使用 AWS SAM CLI 创建了一个部署为容器映像的 Lambda 函数。问题是每次我对代码 (app.py) 和 运行 sam build 进行小改动时,都会下载需求。原因可以从下面的Dockerfile中理解。

Dockerfile

FROM public.ecr.aws/lambda/python:3.8

COPY app.py requirements.txt ./
COPY models /opt/ml/models

RUN python3.8 -m pip install -r requirements.txt -t .

CMD ["app.lambda_handler"]

每次我 运行 sam build.

它都会下载需求

我在 github 上也遇到过使用 --cached 选项的帖子,但如果我们使用容器映像,它就不起作用。 https://github.com/aws/aws-sam-cli/issues/805

template.yml

AWSTemplateFormatVersion: '2010-09-09'
Transform: AWS::Serverless-2016-10-31

Globals:
  Function:
    Timeout: 50
    MemorySize: 5000

Resources:
  InferenceFunction:
    Type: AWS::Serverless::Function # More info about Function Resource: https://github.com/awslabs/serverless-application-model/blob/master/versions/2016-10-31.md#awsserverlessfunction
    Properties:
      PackageType: Image
      Architectures:
        - x86_64
    Metadata:
      Dockerfile: Dockerfile
      DockerContext: ./app
      DockerTag: python3.8-v1

依赖是tensorflow 2.8.0,超过200MB,我无法更改为任何其他选项,如tensorflow-lite。

根据 docker 缓存的工作方式,COPY 语句之后的所有内容都在缓存中无效(假设更改)。依赖项通常保留在缓存中的方式是仅添加安装依赖项所必需的内容,安装它们,然后仅在安装依赖项后添加您的服务代码。在下面的示例中,如果 requirements.txt 发生变化,pip install 只会 运行 多次。

FROM public.ecr.aws/lambda/python:3.8

COPY requirements.txt ./
RUN python3.8 -m pip install -r requirements.txt -t .

COPY app.py ./
COPY models /opt/ml/models

CMD ["app.lambda_handler"]