CodeBuild 未能在 docker 构建中从 S3 中提取文件

CodeBuild failing to pull file from S3 in docker build

我有一个 CodeBuild 项目,它运行 docker 构建命令和 buildspec.yml 这样的

version: 0.2

phases:
  pre_build:
    commands:
      - echo Logging in to Amazon ECR...
      - aws ecr get-login-password --region $AWS_DEFAULT_REGION | docker login --username AWS --password-stdin $AWS_ACCOUNT_ID.dkr.ecr.$AWS_DEFAULT_REGION.amazonaws.com
  build:
    commands:
      - echo Build started on `date`
      - echo Building the Docker image...          
      - docker build -t $IMAGE_REPO_NAME:$IMAGE_TAG .
      - docker tag $IMAGE_REPO_NAME:$IMAGE_TAG $AWS_ACCOUNT_ID.dkr.ecr.$AWS_DEFAULT_REGION.amazonaws.com/$IMAGE_REPO_NAME:$IMAGE_TAG      
  post_build:
    commands:
      - echo Build completed on `date`
      - echo Pushing the Docker image...
      - docker push $AWS_ACCOUNT_ID.dkr.ecr.$AWS_DEFAULT_REGION.amazonaws.com/$IMAGE_REPO_NAME:$IMAGE_TAG

但是在 docker 构建过程中,我有一个运行 aws s3 cp 命令的 sh 脚本。我已将服务角色权限授予存储桶,但我得到的错误是。

+ aws s3 cp s3://bucket/file /var/www/html/filelocal
fatal error: Unable to locate credentials

角色不会传播到 Codebuild 上的 Docker 吗?

您正在构建一个独立的文件系统。如果您 运行 docker 使用本地计算机上的凭据在本地构建,您会看到相同的行为。您必须将凭据添加到您的容器才能 运行 这些相同的操作。话虽如此,您可以通过 build-args or 将凭据添加到您的容器中您可以只使用 codebuild 角色来收集您需要的文件,然后在构建过程中将这些文件复制到容器中.我会投票支持第二种方式,这样您就不必担心在发布容器之前清理凭证。虽然您可以查询环境以获取角色的临时凭证,这意味着您可能不必担心清理这些凭证,但您可以通过让代码构建角色处理收集您需要构建的文件来轻松消除这些担忧容器。