簡體   English   中英

使用 AWS cdk 部署停靠的 .NET6 lambda 時如何自定義 docker 構建上下文?

[英]How to customize docker build context when deploy a dockized .NET6 lambda using AWS cdk?

我正在嘗試使用AWS CDK中的Code.fromAssetImage方法部署停靠的.NET Lambda 應用程序。

我的文件夾結構如下所示

Lambda.Lab - 根文件夾

  • Lambda.App - 文件夾包含 csprojects
    • AWSLambda1 - .NET6 AWS Lambda 項目
      • Dockerfile
    • AWSLambda1.Data - .NET6 類庫項目
  • Infra - 文件夾包含 cdk 項目
      • infra-stack.ts - 堆棧文件

我通過在AWSLambda1項目文件夾下成功運行以下命令來測試構建 Dockerfile。 請注意,我在命令末尾使用..將構建上下文從 Dockerfile 所在的位置向上移動,以便訪問依賴類庫AWSLambda1.Data

docker build -t AWSLambda1 ..

碼頭工人文件

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

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

#WORKDIR "/src/AWSLambda1"
COPY . .
RUN dotnet build "AWSLambda1/AWSLambda1.csproj" --configuration Release --output /app/build
# --configuration Release --output /app/build

FROM build AS publish
RUN dotnet publish "AWSLambda1/AWSLambda1.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 ["AWSLambda1::AWSLambda1.Function::FunctionHandler"]

所以我的問題是如何使用 AWS CDK 部署相同的東西? 我可以看到需要解決的兩個問題

  1. 確保AWSLambda1AWSLambda1都被 CDK 項目捕獲
  2. 確保構建上下文設置為AWSLambda1項目的上一級

下面是我的infra-stack.ts ,我嘗試解決這個問題,但到目前為止還沒有運氣。

import { Stack, StackProps, Duration, CfnOutput } from 'aws-cdk-lib';
import { Construct } from 'constructs';
// import * as sqs from 'aws-cdk-lib/aws-sqs';
import * as lambda from 'aws-cdk-lib/aws-lambda';
import * as path from 'path';
import { Code, Handler } from 'aws-cdk-lib/aws-lambda';

export class InfraStack extends Stack {
  constructor(scope: Construct, id: string, props?: StackProps) {
    super(scope, id, props);

    const fn = new lambda.Function(this, 'lambda-docker-attempt1', {
      runtime: lambda.Runtime.FROM_IMAGE,
      handler: Handler.FROM_IMAGE,

      //attempt 1
      //code: Code.fromAssetImage(path.join(__dirname,'../../lambda.app/AWSLambda1')),
      //[100%] fail: docker build --tag cdkasset-b0efaad78ead998b80e6ab6595a21d7fe24c06ec70f65d4e9005540eabf13161 . 
      //exited with error code 1: COPY failed: file not found in build context or excluded by .dockerignore: stat AWSLambda1/AWSLambda1.csproj: file does not exist

      //attempt 2
      // code: Code.fromAssetImage(path.join(__dirname,'../../lambda.app/'),{
      //   file: '/AWSLambda1/Dockerfile',
      // }),
      //[100%] fail: docker build --tag cdkasset-1005a75db171185bca51ea88ef8b74313d444af0d936e946ebe7493d684ab9dc --file /AWSLambda1/Dockerfile . 
      //exited with error code 1: unable to prepare context: unable to evaluate symlinks in Dockerfile path: CreateFile C:\AWSLambda1: The system cannot find the file specified.

      //attempt 3
      code: Code.fromAssetImage(path.join(__dirname,'../../'),{
        file: '/lambda.app/AWSLambda1/Dockerfile',
      }),
      //[100%] fail: docker build --tag cdkasset-1005a75db171185bca51ea88ef8b74313d444af0d936e946ebe7493d684ab9dc --file /AWSLambda1/Dockerfile . 
      //exited with error code 1: unable to prepare context: unable to evaluate symlinks in Dockerfile path: CreateFile C:\AWSLambda1: The system cannot find the file specified.

      timeout: Duration.seconds(30),
    });
  }
}

我發現了一個關於 DockerImageAsset 的舊討論,這似乎與我的問題相似,但我的問題僅用於 lambda 部署。

我是 AWS CDK 的新手,不確定我正在尋找的東西是否可行或現在。 任何建議都非常感謝。 非常感謝提前!!!

多虧了我可愛的同事亞歷克斯,它變成了“嘗試 2”是最接近的答案,只需稍作改動即可刪除file路徑的前面“/”,然后它就變成了實際答案。 下面附上完整的答案。 希望這可以幫助任何有同樣問題的人。

import { Stack, StackProps, Duration } from 'aws-cdk-lib';
import { Construct } from 'constructs';
import * as lambda from 'aws-cdk-lib/aws-lambda';
import * as path from 'path';
import { Code, Handler } from 'aws-cdk-lib/aws-lambda';

export class InfraStack extends Stack {
  constructor(scope: Construct, id: string, props?: StackProps) {
    super(scope, id, props);

    const fn = new lambda.Function(this, 'lambda-docker-attempt1', {
      runtime: lambda.Runtime.FROM_IMAGE,
      handler: Handler.FROM_IMAGE,
      code: Code.fromAssetImage(path.join(__dirname,'../../lambda.app/'),{
        file: 'AWSLambda1/Dockerfile',
      }),
      timeout: Duration.seconds(30),
    });
  }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM