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
相关产品推荐
相关产品推荐

