

這是 AWS CDK v2 開發人員指南。較舊的 CDK v1 已於 2022 年 6 月 1 日進入維護，並於 2023 年 6 月 1 日結束支援。

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# 在 CDK 應用程式中建置和部署容器映像資產
<a name="build-containers"></a>

當您使用 AWS 雲端開發套件 (AWS CDK) 建置容器映像資產時，預設會使用 Docker 來執行這些動作。如果您想要使用不同的容器管理工具，您可以透過 `CDK_DOCKER`環境變數取代 Docker。

## 範例：使用 AWS CDK 建置和發佈容器映像資產
<a name="build-containers-intro-example"></a>

以下是使用 Docker 預設建置容器資產並將其發佈至 Amazon Elastic Container Registry (Amazon ECR) 的 AWS CDK 應用程式簡單範例：

 **專案結構**   

```
my-cdk-app/
├── lib/
│   ├── my-stack.ts
│   └── docker/
│       ├── Dockerfile
│       └── app/
│           └── index.js
├── bin/
│   └── my-cdk-app.ts
├── package.json
├── tsconfig.json
└── cdk.json
```

 **Dockerfile**   

```
FROM public.ecr.aws/lambda/nodejs:16

# Copy application code
COPY app/ /var/task/

# (Optional) Install dependencies
# RUN npm install

# The Lambda Node.js base image looks for index.handler by default
```

 **應用程式碼**   
在 `lib/docker/app/index.js` 中：  

```
console.log("Hello from inside the container!");
```

 **CDK 堆疊**   

```
import * as cdk from 'aws-cdk-lib';
import { Construct } from 'constructs';
import * as ecr_assets from 'aws-cdk-lib/aws-ecr-assets';

export class MyStack extends cdk.Stack {
  constructor(scope: Construct, id: string) {
    super(scope, id);

    // Define a Docker image asset
    const dockerImageAsset = new ecr_assets.DockerImageAsset(this, 'MyDockerImage', {
      directory: 'lib/docker', // Path to the directory containing the Dockerfile
    });

    // Output the ECR URI
    new cdk.CfnOutput(this, 'ECRImageUri', {
      value: dockerImageAsset.imageUri,
    });
  }
}
```

 **CDK 應用程式**   

```
#!/usr/bin/env node
import * as cdk from 'aws-cdk-lib';
import { MyStack } from '../lib/my-stack';

const app = new cdk.App();
new MyStack(app, 'MyStack');
```

執行 時`cdk deploy`， AWS 雲端開發套件 (AWS CDK) 命令列界面 (CLI) 會執行下列動作：

1.  **建置 Docker 映像** – 根據指定目錄中`Dockerfile`的 在`docker build`本機執行 (`lib/docker`)。

1.  **標記映像** – 根據映像內容，執行 `docker tag` 以使用唯一的雜湊標記建置的映像。

1.  **發佈至 Amazon ECR** – 執行 `docker push` 將容器映像發佈至 Amazon ECR 儲存庫。此儲存庫必須已存在。它會在預設引導程序期間建立。

1.  **輸出映像 URI** – 成功部署後，發佈的容器映像的 Amazon ECR URI 會在命令提示中輸出。這是 Amazon ECR 中 Docker 映像的 URI。

## 如何使用另一個容器管理工具取代 Docker
<a name="build-container-replace"></a>

使用 `CDK_DOCKER`環境變數來指定替換容器管理工具之二進位檔的路徑。以下是使用 取代 Docker 的範例Finch：

```
$ which finch
/usr/local/bin/finch # Locate the path to the binary

$ export CDK_DOCKER='/usr/local/bin/finch' # Set the environment variable

$ cdk deploy # Deploy using the replacement
```

不支援別名或連結。若要取代 Docker，您必須使用 `CDK_DOCKER`環境變數。

## 支援的 Docker 插入式替換引擎
<a name="build-container-supported"></a>

 Finch 受支援，雖然可能有一些 Docker 功能無法使用，或隨著工具的演進，運作方式可能不同。如需 Finch 的詳細資訊，請參閱* AWS 開放原始碼部落格*中的[準備飛行：宣布 Finch 1.0 GA！](https://aws.amazon.com/blogs/opensource/ready-for-flight-announcing-finch-1-0-ga/)。

其他容器管理工具可能會運作。CDK 不會檢查您用來判斷是否支援哪個 Docker 替換。如果工具具有同等的 Docker 命令且行為類似，則應該可以運作。