GitHub工作流中Docker容器内无法使用AWS凭证访问S3怎么办?
解决GitHub工作流中Docker容器访问AWS S3缺少凭证的问题
核心原因
aws-actions/configure-aws-credentials会将AWS临时凭证注入到GitHub Runner的环境变量或本地凭证文件中,但Docker容器默认不会自动继承这些环境变量或文件,导致容器内的AWS CLI无法获取凭证。
可行解决方法
1. 通过环境变量传递凭证(推荐)
AWS CLI会自动读取AWS_ACCESS_KEY_ID、AWS_SECRET_ACCESS_KEY、AWS_SESSION_TOKEN、AWS_REGION这些环境变量,在docker run时直接传递这些变量即可:
docker run \ -e AWS_ACCESS_KEY_ID=$AWS_ACCESS_KEY_ID \ -e AWS_SECRET_ACCESS_KEY=$AWS_SECRET_ACCESS_KEY \ -e AWS_SESSION_TOKEN=$AWS_SESSION_TOKEN \ -e AWS_REGION=us-east-1 \ my-image /bin/bash -c "aws s3 ls s3://misery/"
2. 挂载本地凭证文件到容器
GitHub Runner生成的AWS凭证会保存在~/.aws目录下(包含credentials和config文件),通过Docker的卷挂载功能将该目录映射到容器内的对应路径:
# 容器内以root用户运行时 docker run -v ~/.aws:/root/.aws my-image /bin/bash -c "aws s3 ls s3://misery/" # 容器内以普通用户运行时(比如用户名为appuser) docker run -v ~/.aws:/home/appuser/.aws my-image /bin/bash -c "aws s3 ls s3://misery/"
3. 不推荐:构建镜像时注入凭证
这种方式会将临时凭证打包进镜像,存在凭证泄露的安全风险,仅在测试场景临时使用:
ARG AWS_ACCESS_KEY_ID ARG AWS_SECRET_ACCESS_KEY ARG AWS_SESSION_TOKEN ENV AWS_ACCESS_KEY_ID=$AWS_ACCESS_KEY_ID ENV AWS_SECRET_ACCESS_KEY=$AWS_SECRET_ACCESS_KEY ENV AWS_SESSION_TOKEN=$AWS_SESSION_TOKEN
运行构建命令时传入参数:
docker build --build-arg AWS_ACCESS_KEY_ID=$AWS_ACCESS_KEY_ID ... .
注意事项
configure-aws-credentials生成的是临时凭证,有效期通常为1小时,需确保容器运行时凭证未过期;- 容器内的AWS CLI版本需与外部兼容,避免因凭证格式解析差异导致的错误;
- 若使用卷挂载方式,需确认容器内用户对挂载的
.aws目录有读取权限。
内容的提问来源于stack exchange,提问作者Lukasz Tracewski
相关产品推荐
相关产品推荐

