将.NET Core 3.1应用以容器镜像部署到Lambda时遇文件缺失错误
部署.NET Core 3.1 Lambda Docker镜像时提示找不到blank-csharp.deps.json
问题描述
我尝试构建Docker镜像并部署为运行C# .NET Core 3.1的Lambda函数,操作步骤如下:
- 克隆空白C#示例仓库
- 在
src/blank-csharp目录下添加Dockerfile,内容如下:
FROM public.ecr.aws/lambda/dotnet:core3.1.2022.08.18.10 COPY . ${LAMBDA_TASK_ROOT} CMD [ "blank-csharp::blankCsharp.Function::FunctionHandler" ]
- 执行构建命令:
docker build -t dotnet-container:latest . - 启动容器:
docker run -p 9000:8080 dotnet-container:latest - 用curl调用函数:
curl -XPOST "http://localhost:9000/2015-03-31/functions/function/invocations" -d '{"payload":"hello world!"}'
调用后出现错误:
{ "errorType": "LambdaException", "errorMessage": "Could not find the required 'blank-csharp.deps.json'. This file should be present at the root of the deployment package." }
解决方案
这个错误的核心原因是直接复制项目源码到镜像中,Lambda运行时需要的是.NET项目编译后的输出文件,blank-csharp.deps.json是编译过程生成的依赖清单文件,源码目录里不存在这个文件。
需要使用多阶段构建的Dockerfile,先在SDK镜像中编译项目,再将编译产物复制到Lambda运行时镜像:
# 第一阶段:编译项目 FROM mcr.microsoft.com/dotnet/sdk:3.1 AS build WORKDIR /src COPY . . RUN dotnet publish -c Release -o /app/publish # 第二阶段:构建Lambda运行镜像 FROM public.ecr.aws/lambda/dotnet:core3.1.2022.08.18.10 COPY --from=build /app/publish ${LAMBDA_TASK_ROOT} CMD [ "blank-csharp::blankCsharp.Function::FunctionHandler" ]
重新执行以下步骤即可:
- 构建镜像:
docker build -t dotnet-container:latest . - 启动容器:
docker run -p 9000:8080 dotnet-container:latest - 再次用curl调用验证函数
注意:确保在src/blank-csharp目录下执行构建命令,保证Dockerfile能正确读取项目文件。
内容的提问来源于stack exchange,提问作者Boris Grunwald
相关产品推荐
相关产品推荐

