使用docker-compose运行CDK时出现EISDIR目录读取错误求助
问题:Docker Compose运行CDK时出现EISDIR错误
执行以下命令:
sudo docker-compose -f "docker-compose-infra.yml" run cdk
出现错误:
EISDIR: illegal operation on a directory, read
相关docker-compose-infra.yml文件内容:
version: "3" services: cdk: command: bash -c "cdk deploy --require-approval never --all --parameters service-${ENVIRONMENT}-service:ServiceImageTag=${IMAGE_TAG}" build: context: ./ dockerfile: Dockerfile.infra environment: - AWS_PROFILE=${AWS_PROFILE} - ENVIRONMENT=${ENVIRONMENT} - DEPLOY_ACCOUNT=${DEPLOY_ACCOUNT} volumes: - ~/.aws/credentials:/root/.aws/credentials
补充信息:单独执行sudo cdk synth -vvv的输出:
[18:12:57] CDK toolkit version: 2.61.1 (build d319d9c) [18:12:57] Command line arguments: { _: [ 'synth' ], v: 3, verbose: 3, lookups: true, 'ignore-errors': false, ignoreErrors: false, json: false, j: false, debug: false, ec2creds: undefined, i: undefined, 'version-reporting': undefined, versionReporting: undefined, 'path-metadata': true, pathMetadata: true, 'asset-metadata': true, assetMetadata: true, 'role-arn': undefined, r: undefined, roleArn: undefined, staging: true, 'no-color': false, noColor: false, ci: false, validation: true, quiet: false, q: false, '$0': '/usr/local/bin/cdk' } [18:12:57] cdk.json: { "app": "python3 app.py", "context": { "@aws-cdk/aws-apigateway:usagePlanKeyOrderInsensitiveId": true, "aws-cdk:enableDiffNoFail": "true", "@aws-cdk/aws-rds:lowercaseDbIdentifier": true, "@aws-cdk/aws-cloudfront:defaultSecurityPolicyTLSv1.2_2021": true } } [18:12:57] cdk.context.json: { "availability-zones:account=xxxxxxxx:region=eu-west-1": [ "eu-west-1a", "eu-west-1b", "eu-west-1c" ], "endpoint-service-availability-zones:account=xxxxxxxxx:region=eu-west-1:serviceName=com.amazonaws.vpce.eu-west-1.vpce-svc-xxxxxxxx": [ "eu-west-1a", "eu-west-1b" ] } [18:12:57] merged settings: { versionReporting: true, pathMetadata: true, output: 'cdk.out', app: 'python3 app.py', context: { '@aws-cdk/aws-apigateway:usagePlanKeyOrderInsensitiveId': true, 'aws-cdk:enableDiffNoFail': 'true', '@aws-cdk/aws-rds:lowercaseDbIdentifier': true, '@aws-cdk/aws-cloudfront:defaultSecurityPolicyTLSv1.2_2021': true }, debug: false, assetMetadata: true, toolkitBucket: {}, staging: true, bundlingStacks: [ '**' ], lookups: true } [18:12:57] [trace] SdkProvider#withAwsCliCompatibleDefaults() [18:12:57] Determining if we're on an EC2 instance. [18:12:57] Does not look like an EC2 instance. [18:12:57] Reading cached notices from /root/.cdk/cache/notices.json EISDIR: illegal operation on a directory, read [18:12:57] Error: EISDIR: illegal operation on a directory, read
原因排查
从 verbose 日志可以看到,错误发生在CDK尝试读取/root/.cdk/cache/notices.json时。EISDIR错误的本质是程序试图读取一个目录,而非预期的文件,结合配置和执行场景,核心原因有两个:
- AWS凭证挂载错误:使用
sudo执行命令时,~会解析为root用户的home目录(/root)。如果root用户下不存在.aws/credentials文件,Docker会自动创建一个名为credentials的目录(挂载路径不存在时,Docker默认创建目录而非文件),导致容器内/root/.aws/credentials是目录,CDK处理AWS配置时误将其当作文件读取,触发错误。 - CDK缓存目录异常:容器内
/root/.cdk/cache/notices.json路径实际是目录,可能是镜像构建时的遗留问题,或是宿主机挂载目录时的冲突。
解决方法
方法1:修正AWS凭证挂载路径
避免使用sudo执行docker-compose,或者明确指定当前用户的.aws/credentials绝对路径,防止解析到root的home目录:
volumes: - /home/你的用户名/.aws/credentials:/root/.aws/credentials
如果必须用sudo,先确保当前用户拥有Docker权限(将用户加入docker组:sudo usermod -aG docker 你的用户名),之后无需sudo即可执行docker命令。
方法2:确保root用户下存在credentials文件
如果必须使用sudo,先在root用户环境中创建合法的credentials文件:
sudo su - mkdir -p ~/.aws touch ~/.aws/credentials # 写入AWS凭证内容(如aws_access_key_id和aws_secret_access_key) exit
这样挂载时Docker会识别为文件,不会创建目录。
方法3:修复CDK缓存文件
在Docker Compose的command中提前创建CDK缓存所需的文件,避免读取目录的错误:
command: bash -c "mkdir -p /root/.cdk/cache && touch /root/.cdk/cache/notices.json && cdk deploy --require-approval never --all --parameters service-${ENVIRONMENT}-service:ServiceImageTag=${IMAGE_TAG}"
也可以在Dockerfile.infra中添加初始化步骤:
RUN mkdir -p /root/.cdk/cache && touch /root/.cdk/cache/notices.json
内容的提问来源于stack exchange,提问作者gravitypulling
相关产品推荐
相关产品推荐

