

这是 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>

下面是一个 AWS CDK 应用程序简单示例，它默认使用 Docker 构建容器资产并将其发布到 Amazon Elastic Container Registry (Amazon ECR)：

 **项目结构**   

```
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
```

 **应用程序代码**   
In `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 映像** – 根据指定目录 (`lib/docker`) 中的 `Dockerfile` 在本地运行 `docker build`。

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 开放源代码博客*中的 [Ready for Flight: Announcing Finch 1.0 GA\!](https://aws.amazon.com/blogs/opensource/ready-for-flight-announcing-finch-1-0-ga/)。

其他容器管理工具可能会起作用。CDK 不会检查您使用的是哪个 Docker 替代品来确定它是否受支持。如果该工具具有等效的 Docker 命令并且行为类似，则应能正常工作。