registry:2容器启动必须挂载含auth配置的config.yml才能启用认证,仅挂载htpasswd文件无效;需确保config.yml正确挂载、YAML缩进严格、realm值与WWW-Authenticate头一致、htpasswd路径匹配且权限为644,并配置insecure-registries。

registry:2 容器启动时必须挂载 config.yml 才能启用 auth
Registry 默认不开启任何认证,哪怕你挂了 htpasswd 文件也无效——关键在于 config.yml 是否被正确加载并启用 auth 段。常见错误是只挂载了密码文件却漏掉配置文件,导致容器完全忽略认证逻辑。
必须确保以下三点同时满足:
-
docker run中用-v /opt/registry/config.yml:/etc/registry/config.yml显式挂载配置路径 -
config.yml里包含完整的auth:块,且缩进严格(YAML 对空格敏感) -
realm字段值需与客户端收到的WWW-Authenticate头中realm完全一致,否则docker login会静默失败
htpasswd 文件生成和挂载路径必须匹配 config.yml 中的 path
错误示例:htpasswd -Bbn admin 123456 > /opt/registry/htpasswd 生成文件,但 config.yml 写的是 path: /etc/registry/auth/htpasswd —— 这会导致 401 错误且无日志提示具体原因。
实操建议:
- 统一用绝对路径生成和引用,例如都用
/opt/registry/htpasswd - 容器内路径必须与
config.yml中path:一致,如path: /etc/registry/htpasswd→ 挂载参数就得是-v /opt/registry/htpasswd:/etc/registry/htpasswd - 确认文件权限:容器内
registry进程以非 root 用户(uid=1001)运行,宿主机上htpasswd文件需对组/其他用户可读(chmod 644)
客户端 docker login 必须带端口,且 daemon.json 要配 insecure-registries
若 Registry 运行在 192.168.1.100:5000,执行 docker login 192.168.1.100:5000 是唯一有效方式。用 docker login 192.168.1.100 或 docker login localhost:5000(从非本机访问)都会失败,因为凭证只绑定到完整地址。
更隐蔽的问题是:即使 login 成功,push 仍报 no basic auth credentials。这是因为 Docker daemon 默认拒绝向 HTTP 协议的非 localhost 地址发送认证头,必须显式配置:
- 编辑
/etc/docker/daemon.json,加入"insecure-registries": ["192.168.1.100:5000"] - 重启 daemon:
sudo systemctl restart docker(不是dockerd) - 注意:该配置仅对当前 host 生效,不能跨机器复用
401 Unauthorized 的真实原因往往不是密码错,而是 realm 不匹配或挂载失效
当 curl -v http://192.168.1.100:5000/v2/ 返回 401,看响应头里的 WWW-Authenticate 字段:
- 如果值是
Basic realm="basic-realm",说明认证已启用,但凭据未通过(检查htpasswd内容、用户名大小写、密码是否含特殊字符) - 如果值是
Bearer realm="https://auth.example.com/token",说明你误启用了 Token 认证(比如 config.yml 里写了token而非htpasswd),此时docker login根本不会发 Basic Auth 头 - 如果压根没这个头,或者返回 200,说明
auth段根本没生效——立刻检查 config.yml 是否挂载成功、YAML 缩进、registry 容器日志是否有error parsing config
最易被忽略的一点:Registry v2.8+ 对 config.yml 格式校验更严,storage.delete.enabled 必须是布尔值(true / false),写成字符串 "true" 会导致整个配置加载失败,auth 静默降级为关闭状态。


















