如何将 .NET6 AWS Lambda 项目与相关的 class 库项目对接

How to dockerize .NET6 AWS Lambda project with dependent class library projects

我在一个解决方案中有四个项目:

解决方案结构如下所示:

解决方案:

我正在尝试为 App.LambdaOneApp.LambdaTwo 创建两个 docker 映像,以便我可以单独部署它们。

到目前为止,我使用下面的 Dockfile 得到了一个没有任何依赖项目的简单 lambda 项目。

Docker 命令在 App.LambdaSimple 的目录

docker build -t LambdaSimpleImage .

Docker文件

FROM public.ecr.aws/lambda/dotnet:6 AS base

FROM mcr.microsoft.com/dotnet/sdk:6.0-bullseye-slim as build
WORKDIR /src
COPY ["App.LambdaSimple.csproj", "App.LambdaSimple/"]
RUN dotnet restore "App.LambdaSimple.csproj"

WORKDIR "/src/App.LambdaSimple"
COPY . .
RUN dotnet build "App.LambdaSimple.csproj" --configuration Release --output /app/build

FROM build AS publish
RUN dotnet publish "App.AWSLambdaOne.csproj" \
            --configuration Release \ 
            --runtime linux-x64 \
            --self-contained false \ 
            --output /app/publish \
            -p:PublishReadyToRun=true  

FROM base AS final
WORKDIR /var/task
COPY --from=publish /app/publish .
CMD ["App.LambdaSimple::App.LambdaSimple.Function::FunctionHandler"]

但棘手的部分是App.LambdaOne依赖于App.DataApp.Core。我试图修改工作示例以部署 App.LambdaOne,但到目前为止运气不好。通过运行同样的Docker命令。出现错误,我已将其添加到评论中

FROM public.ecr.aws/lambda/dotnet:6 AS base

FROM mcr.microsoft.com/dotnet/sdk:6.0-bullseye-slim as build
WORKDIR /src
COPY ["App.AWSLambdaOne.csproj", "App.AWSLambdaOne/"]
#Error: cannot find App.Data.csproj
COPY ["App.Data.csproj", "App.Data/"]
RUN dotnet restore "App.LambdaOne.csproj"

WORKDIR "/src/App.AWSLambdaOne"
COPY . .
RUN dotnet build "App.AWSLambdaOne.csproj" --configuration Release --output /app/build

FROM build AS publish
RUN dotnet publish "App.AWSLambdaOne.csproj" \
            --configuration Release \ 
            --runtime linux-x64 \
            --self-contained false \ 
            --output /app/publish \
            -p:PublishReadyToRun=true  

FROM base AS final
WORKDIR /var/task
COPY --from=publish /app/publish .
CMD ["App.AWSLambdaOne::App.AWSLambdaOne.Function::FunctionHandler"]

我能理解为什么会出现错误,这是因为 Docker 上下文在 App.AWSLambdaOne 下。但是找不到任何解决方案来修复它。

我发现的部分解决方案是在解决方案级别拥有 Docker 文件,因此 Docker 上下文在构建它时包括所有项目。但是,它不符合我的目的,因为我想为不同的项目构建两个图像。

这两天我一直在寻找线索,快把我逼疯了。请问是否可以用现有的项目结构实现我想要的?如果没有,谁能告诉我正确的方向?

非常感谢!

您无法访问构建上下文之外的主机文件,因此您必须将构建上下文向上移动一个目录才能访问其他项目的代码。因此,首先,让我们将构建命令更改为

docker build -t LambdaSimpleImage ..

现在我们需要调整 Dockerfile 以适应新的环境

FROM public.ecr.aws/lambda/dotnet:6 AS base

FROM mcr.microsoft.com/dotnet/sdk:6.0-bullseye-slim as build
WORKDIR /src
COPY ["App.LambdaSimple/App.LambdaSimple.csproj", "App.LambdaSimple/"]
COPY ["App.Data/App.Data.csproj", "App.Data/"]
COPY ["App.Core/App.Core.csproj", "App.Core/"]

RUN dotnet restore "App.LambdaSimple/App.LambdaSimple.csproj"

COPY . .
RUN dotnet build "App.LambdaSimple/App.LambdaSimple.csproj" --configuration Release --output /app/build

FROM build AS publish
RUN dotnet publish "App.LambdaSimple/App.LambdaSimple.csproj" \
            --configuration Release \ 
            --runtime linux-x64 \
            --self-contained false \ 
            --output /app/publish \
            -p:PublishReadyToRun=true  

FROM base AS final
WORKDIR /var/task
COPY --from=publish /app/publish .
CMD ["App.LambdaSimple::App.LambdaSimple.Function::FunctionHandler"]