如何为同一Docker Registry实现多身份认证/多登录?GitLab场景咨询
处理GitLab Docker Registry多项目部署令牌的登录问题
嘿,我太懂你这个场景了——用GitLab集成的Docker Registry,给每个项目单独生成部署令牌,已经在主机上成功登录registry.example.com/project1拉取镜像,现在要搞同一个Registry下的project2项目,用对应的令牌登录。这里得提醒你:直接重复docker login不同项目路径的话,会把之前的凭证覆盖掉,之后拉project1的镜像就得重新登录了!
给你两个亲测有效的解决办法:
方法一:手动修改Docker配置文件,并存多个项目凭证
Docker的配置文件(默认在~/.docker/config.json)支持为不同的Registry路径单独配置凭证,这样就不会互相覆盖。步骤很简单:
- 先把
project2的部署令牌转成base64编码:
把令牌的用户名(一般是gitlab+deploy-token-xxx格式)和密码用冒号拼起来,比如gitlab+deploy-token-456:myproject2token,然后跑这个命令生成编码:echo -n "gitlab+deploy-token-456:myproject2token" | base64 - 打开
~/.docker/config.json,在auths节点里加个registry.example.com/project2的条目,最终配置大概是这样:{ "auths": { "registry.example.com/project1": { "auth": "这里是project1令牌的base64编码" }, "registry.example.com/project2": { "auth": "刚才生成的project2的base64编码" } } } - 保存文件后直接拉
project2的镜像就行,Docker会自动匹配对应路径的凭证,不用再登录了。
方法二:用--config参数指定专属配置文件
如果你不想动默认的配置文件,完全可以给每个项目单独弄个Docker配置文件:
- 登录
project2的时候指定专属配置:docker login https://registry.example.com/project2 --config ~/.docker/config-project2.json - 拉
project2镜像的时候,同样指定这个配置文件:docker pull registry.example.com/project2/my-image:latest --config ~/.docker/config-project2.json
或者临时设个环境变量来指定配置文件路径,这样拉镜像的时候不用每次加参数:
export DOCKER_CONFIG=~/.docker/config-project2.json docker pull registry.example.com/project2/my-image:latest unset DOCKER_CONFIG # 用完记得取消环境变量,避免影响其他操作
为啥直接登录会踩坑?
Docker默认是把登录凭证和Registry根域名绑定的,哪怕你登录的时候写了项目路径(比如registry.example.com/project1),它也会把凭证存在根域名registry.example.com下面。所以第二次登录project2的时候,就会把之前project1的凭证覆盖掉,之后再拉project1的镜像就会提示未授权,得重新登录。
上面的两种方法就是让Docker把不同的项目路径当成独立的Registry端点,这样就能各自用各自的部署令牌啦。
内容的提问来源于stack exchange,提问作者gucki
相关产品推荐
相关产品推荐

