如何将 .NET6 AWS Lambda 项目与相关的 class 库项目对接
How to dockerize .NET6 AWS Lambda project with dependent class library projects
我在一个解决方案中有四个项目:
App.Data
- class 图书馆
App.Core
- class 图书馆
App.LambdaOne
- AWS Lambda 项目
App.LambdaTwo
- AWS Lambda 项目
解决方案结构如下所示:
解决方案:
- App.Data
- App.Core
- App.LambdaOne
- Docker文件
- App.LambdaTwo
- Docker文件
我正在尝试为 App.LambdaOne
和 App.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.Data
和App.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"]
我在一个解决方案中有四个项目:
App.Data
- class 图书馆App.Core
- class 图书馆App.LambdaOne
- AWS Lambda 项目App.LambdaTwo
- AWS Lambda 项目
解决方案结构如下所示:
解决方案:
- App.Data
- App.Core
- App.LambdaOne
- Docker文件
- App.LambdaTwo
- Docker文件
我正在尝试为 App.LambdaOne
和 App.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.Data
和App.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"]