使用Watchtower更新Docker容器遇“No basic auth credentials”错误求助
问题背景
我有一台运行Ubuntu 22.04.1 LTS(Jammy Jellyfish)的EC2实例,需要在AWS ECR有新镜像时自动拉取、替换并重启Docker容器。使用Watchtower配置后,首次能正常拉取并运行容器,但后续检查镜像仓库时返回错误No basic auth credentials,请求解决办法或替代工具。
环境配置
Dockerfile
FROM ubuntu RUN echo "Hi there!" CMD sleep 2500
docker-compose.yml(******为AWS账号ID)
version: "3" services: ubuntu: image: ******.dkr.ecr.us-east-1.amazonaws.com/mytest:latest container_name: mytest watchtower: image: containrrr/watchtower container_name: watchtower volumes: - /var/run/docker.sock:/var/run/docker.sock - .docker/config.json:/home/administrator/.docker/config.json - helper:/go/bin environment: - HOME=/ - PATH=$PATH:/go/bin - AWS_REGION=us-east-1 command: ['mytest','--schedule','30 * * * * *'] volumes: helper: external: true
~/.docker/config.json
{ "credsStore" : "ecr-login", "HttpHeaders" : { "User-Agent" : "Docker-Client/19.03.1 (XXXXXX)" }, "auths": { "******.dkr.ecr.us-east-1.amazonaws.com": { "auth": "Lot of random letters" } }, "credHelpers": { "******.dkr.ecr.us-east-1.amazonaws.com" : "ecr-login" } }
已安装工具
已将docker-credential-ecr-login放置在/go/bin/目录:
$ ls /go/bin/ docker-credential-ecr-login
错误日志
执行docker-compose up -d能正常启动容器,但Watchtower后续检查时出现认证错误:
$ docker logs 27238edee0b1 time="2022-12-24T03:44:02Z" level=info msg="Watchtower 1.5.1" time="2022-12-24T03:44:02Z" level=info msg="Using no notifications" time="2022-12-24T03:44:02Z" level=info msg="Only checking containers which name matches \"mytest\"" time="2022-12-24T03:44:02Z" level=info msg="Scheduling first run: 2022-12-24 03:44:30 +0000 UTC" time="2022-12-24T03:44:02Z" level=info msg="Note that the first check will be performed in 27 seconds" time="2022-12-24T03:44:30Z" level=info msg="Unable to update container \"/mytest\": Error response from daemon: Head \"https://******.dkr.ecr.us-east-1.amazonaws.com/v2/mytest/manifests/latest\": no basic auth credentials. Proceeding to next." time="2022-12-24T03:44:30Z" level=info msg="Session done" Failed=0 Scanned=1 Updated=0 notify=no
已尝试的解决方法
- 遵循Watchtower私有仓库配置指引
- 搜索并尝试相关社区解决方案
- 将AWS CLI更新至最新版本aws-cli/2.9.9
- 修改
~/.docker/config.json为以下简化格式:
或:{ "credsStore": "ecr-login" }{ "auths": { "000000000000.dkr.ecr.us-east-1.amazonaws.com": {} }, "credsStore": "ecr-login" } - 删除
~/.docker/config.json后重新执行ECR登录命令:aws ecr get-login-password --region eu-central-1 | docker login --username AWS --password-stdin ******.dkr.ecr.eu-central-1.amazonaws.com - 尝试使用Watchtower的
--interval和--schedule两种调度选项
解决方案
方案1:修复Watchtower的权限与配置映射问题
修正config.json挂载路径:Watchtower容器内默认用户的Docker配置路径为
/root/.docker/config.json,而非/home/administrator/.docker/config.json。修改docker-compose.yml中watchtower的volume映射:volumes: - /var/run/docker.sock:/var/run/docker.sock - ~/.docker/config.json:/root/.docker/config.json - /go/bin/docker-credential-ecr-login:/usr/local/bin/docker-credential-ecr-login直接挂载单个二进制文件,避免外部卷带来的路径问题。
简化config.json配置:移除冗余的auths字段(ECR令牌会自动过期,无需硬编码),保留核心配置:
{ "credsStore": "ecr-login", "credHelpers": { "******.dkr.ecr.us-east-1.amazonaws.com": "ecr-login" } }确保凭证助手可执行:在宿主机上给
docker-credential-ecr-login添加可执行权限:chmod +x /go/bin/docker-credential-ecr-login传递AWS凭证:如果EC2实例未附加IAM角色,需在watchtower的environment中添加AWS密钥(推荐优先给EC2实例附加具有
AmazonEC2ContainerRegistryReadOnly权限的IAM角色,无需手动配置密钥):environment: - AWS_REGION=us-east-1 - AWS_ACCESS_KEY_ID=your-access-key - AWS_SECRET_ACCESS_KEY=your-secret-key
方案2:替代工具推荐
如果Watchtower配置仍有问题,可尝试以下工具:
- Docker Compose Watch:Docker官方工具,支持镜像更新检测与自动重启,适合简单场景。
- Renovate:专注依赖更新,支持Docker镜像,可配置自动拉取ECR新镜像并触发部署,适合CI/CD集成场景。
- AWS原生方案:通过CodePipeline监听ECR镜像变更,自动更新ECS服务(若使用AWS ECS),全托管无需额外维护。
内容的提问来源于stack exchange,提问作者Aleksandr

