如何dockerize . net 6 AWS Lambda项目与依赖的类库项目



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

  • App.Data类库
  • App.Core类库
  • App.LambdaOne- AWS Lambda项目App.LambdaTwo- AWS Lambda项目

解决方案结构如下:

解决方案:

  • 应用程序。数据
  • 应用程序。核心
  • 应用程序。LambdaOne
    • Dockerfile
  • 应用程序。LambdaTwo
    • Dockerfile

我正在尝试为App.LambdaOneApp.LambdaTwo创建两个docker映像,因此我可以分别部署它们。

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

App.LambdaSimple目录下的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.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下。但却找不到任何解决办法。

我发现的部分解决方案是在解决方案级别拥有Dockerfile,因此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"]

最新更新