You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

CDK Synth在DockerImageAsset的AssetStaging阶段卡顿的解决咨询

解决CDK DockerImageAsset卡顿与无限递归问题

运行cdk synth -vvv --debug时,进程卡在DockerImageAsset创建步骤,调试发现AssetStaging计算哈希时反复执行_processFileOrDirectory,还出现cdk.out无限递归复制的情况。

根源是你把DockerImageAsset的directory设为了项目根目录,而根目录下docker_images/package_scene/assets包含大量GB级文件,导致CDK需要遍历整个项目目录计算哈希,耗时极长;同时根目录包含cdk.out,在 staging 时会被递归复制,形成死循环。

核心解决思路:缩小Docker构建上下文

1. 将构建上下文改为Dockerfile所在目录

把directory指向docker_images/package_scene(也就是Dockerfile和assets所在的目录),这样CDK只会处理该目录下的必要文件,避免遍历整个项目。

修改后的代码:

import * as cdk from 'aws-cdk-lib';
import { aws_s3 as s3, aws_lambda as lambda, aws_ecr_assets as ecr_assets } from 'aws-cdk-lib';
import { Construct } from 'constructs';
import * as path from 'path';

// 直接指向Dockerfile所在的目录,而非项目根目录
const DOCKER_CONTEXT_DIR = path.resolve(__dirname, '../../../../docker_images/package_scene');

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

    const packaged_blender_files = new s3.Bucket(this, 'packaged-blender-files', {
      versioned: true
    });

    const package_scene_ecr_img = new ecr_assets.DockerImageAsset(this, 'package-scene', {
      directory: DOCKER_CONTEXT_DIR,
      // 因为directory已经是Dockerfile所在目录,直接指定文件名即可
      file: 'Dockerfile',
      invalidation: {
        buildArgs: false,
      },
    });

    const handler = new lambda.DockerImageFunction(this, "package-scene", {
      code: lambda.DockerImageCode.fromEcr(package_scene_ecr_img.repository)
    });
  }
}

2. 用.dockerignore排除无关文件(备选方案)

如果因某些原因必须保留项目根目录作为构建上下文,在项目根目录创建.dockerignore文件,排除不必要的目录和文件:

# 排除CDK输出目录,避免递归复制
cdk.out/
# 排除node_modules等依赖目录
node_modules/
# 排除其他无关的大文件/目录
other-large-dirs/

3. 手动指定资产哈希(进阶优化)

如果哈希计算仍然耗时,可以手动设置assetHash参数,跳过自动哈希计算(需自行确保内容变更时更新哈希):

const package_scene_ecr_img = new ecr_assets.DockerImageAsset(this, 'package-scene', {
  directory: DOCKER_CONTEXT_DIR,
  file: 'Dockerfile',
  invalidation: {
    buildArgs: false,
  },
  // 手动指定哈希值,比如基于Dockerfile和assets的内容生成
  assetHash: 'your-custom-hash-value',
});

内容的提问来源于stack exchange,提问作者alagris

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.11 00:33:26