Docker awslogs日志驱动:.aws/credentials存放位置及报错解决
问题描述
根据Docker awslogs官方文档说明:
默认使用AWS共享凭证文件(root用户的~/.aws/credentials)
执行以下命令将AWS credentials 文件复制到该位置后:
sudo bash -c 'mkdir -p $HOME/.aws; cp .aws/credentials $HOME/.aws/credentials'
尝试运行使用该日志驱动的容器:
docker run --log-driver=awslogs --log-opt awslogs-group=neiltest-deleteme --rm hello-world
仍出现凭证错误:
docker: Error response from daemon: failed to initialize logging driver: failed to create Cloudwatch log stream: NoCredentialProviders: no valid providers in chain. Deprecated.
For verbose messaging see aws.Config.CredentialsChainVerboseErrors.
疑问:凭证文件应放在何处?Docker守护进程是否并非以root运行?如何确认其运行用户?
注:systemd系统可通过设置环境变量解决,但Google CloudShell中无效,因其Docker守护进程启动方式特殊。
解决办法
1. 确认Docker守护进程的运行用户
执行以下命令查看dockerd进程的运行用户:
ps aux | grep dockerd
输出中dockerd对应的用户列即为守护进程的运行用户。
2. 放置凭证到正确位置
Docker守护进程读取的是自身运行用户的~/.aws/credentials文件,而非执行docker run命令的用户。若守护进程以root运行,需将凭证放到root的家目录:
sudo mkdir -p /root/.aws sudo cp .aws/credentials /root/.aws/credentials sudo chmod 600 /root/.aws/credentials
必须将凭证文件权限设为600,这是AWS对凭证文件的强制要求,否则会被判定为无效。
3. Google CloudShell 特殊处理
方法一:运行容器时指定凭证路径
直接在docker run命令中通过参数指定凭证文件位置:
docker run --log-driver=awslogs \ --log-opt awslogs-group=neiltest-deleteme \ --log-opt awslogs-region=你的AWS区域 \ --log-opt awslogs-credentials-file=/path/to/your/credentials \ --rm hello-world
方法二:修改Docker守护进程全局配置
创建或编辑/etc/docker/daemon.json文件:
{ "log-opts": { "awslogs-group": "neiltest-deleteme", "awslogs-region": "你的AWS区域", "awslogs-credentials-file": "/path/to/your/credentials" } }
之后重启Docker守护进程:
sudo systemctl restart docker
注:需确认CloudShell环境下你有修改该配置文件的权限
内容的提问来源于stack exchange,提问作者Neil C. Obremski

