我在一个解决方案中有四个项目:
App.Data
类库App.Core
类库
App.LambdaOne
- AWS Lambda项目App.LambdaTwo
- AWS Lambda项目解决方案结构如下:
解决方案:
- 应用程序。数据
- 应用程序。核心
- 应用程序。LambdaOne
- Dockerfile
- 应用程序。LambdaTwo
- Dockerfile
我正在尝试为App.LambdaOne
和App.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.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下。但却找不到任何解决办法。
我发现的部分解决方案是在解决方案级别拥有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"]