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

使用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错误的本质是程序试图读取一个目录,而非预期的文件,结合配置和执行场景,核心原因有两个:

  1. AWS凭证挂载错误:使用sudo执行命令时,~会解析为root用户的home目录(/root)。如果root用户下不存在.aws/credentials文件,Docker会自动创建一个名为credentials的目录(挂载路径不存在时,Docker默认创建目录而非文件),导致容器内/root/.aws/credentials是目录,CDK处理AWS配置时误将其当作文件读取,触发错误。
  2. 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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 04:15:39