非AWS服务器上Docker awslogs驱动无法获取凭证问题排查
docker的awslogs日志驱动由宿主机的Docker daemon进程负责调用,而非容器内部应用。你在容器环境变量里配置的AWS密钥、挂载的~/.aws目录,仅对容器内进程生效,无法被Docker daemon读取。因此Docker daemon会默认尝试从EC2实例元数据服务(IMDS)获取凭据,但非AWS服务器/本地环境不存在该服务,最终导致超时报错。
给宿主机Docker daemon配置AWS凭据
方式1:通过宿主机AWS配置文件设置(推荐)
在宿主机的~/.aws/credentials文件中写入:[default] aws_access_key_id=你的密钥ID aws_secret_access_key=你的密钥同时在
~/.aws/config中指定区域:[default] region=eu-north-1如果Docker daemon以root用户运行,需将上述文件放在
/root/.aws/目录下。配置完成后重启Docker服务:Linux环境执行systemctl restart docker,本地Docker Desktop直接重启应用。方式2:通过环境变量配置Docker daemon
以systemd管理的Docker为例,创建/etc/systemd/system/docker.service.d/aws.conf文件,内容如下:[Service] Environment="AWS_ACCESS_KEY_ID=你的密钥ID" Environment="AWS_SECRET_ACCESS_KEY=你的密钥" Environment="AWS_DEFAULT_REGION=eu-north-1"执行重载配置和重启命令:
systemctl daemon-reload systemctl restart docker
(临时测试用)在docker-compose中直接指定凭据(不推荐生产环境)
修改docker-compose.yaml的logging选项,添加凭据参数:logging: driver: awslogs options: awslogs-group: "test_group" awslogs-region: "eu-north-1" awslogs-stream: "test_stream" awslogs-access-key: "你的密钥ID" awslogs-secret-key: "你的密钥"注意:该方式会将密钥明文暴露在配置文件中,存在安全风险,仅用于临时验证。
验证权限
确保你的AWS账号拥有CloudWatch Logs的必要权限:logs:CreateLogGroup、logs:CreateLogStream、logs:PutLogEvents,避免因权限不足导致其他报错。
内容的提问来源于stack exchange,提问作者Alberto

